Java 更改 ExpandableListView 中指示器的位置导致问题

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18941405/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 12:42:49  来源:igfitidea点击:

Changing the location of indicator in ExpandableListView causing problems

javaandroideclipseexpandablelistview

提问by Guy

I'm trying to set my indicator to be next to the textview, but I just can't get the right code to do it.

我试图将我的指示器设置在 textview 旁边,但我无法获得正确的代码来做到这一点。

XML:

XML:

<TextView
    android:id="@+id/lblListHeader"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
    android:textColor="#000000"
    android:textSize="17dp" />

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_toLeftOf="@+id/lblListHeader"
    android:src="@drawable/custom_arrow" />

This is the only stack of code that I have found researching but I can't get it to work:

这是我发现研究的唯一代码堆栈,但我无法让它工作:

//inside getGropView method
View v;
    if (convertView == null) {
        v = newGroupView(isExpanded, parent);
    } else {
        v = convertView;
    }
    bindView(v, mGroupData.get(groupPosition), mGroupFrom, mGroupTo);
    ((ImageView) v.findViewById(R.id.videos_group_indicator))
    .setImageResource(isExpanded?R.drawable.videos_chevron_expanded:R.drawable.videos_chevron_collapsed);
    return v;

The main problem is that it "underlines" the newGroupView method etc. because I don't have such method and it is not mentioned how to create it in the exampleI was looking at.

主要问题是它“强调”了 newGroupView 方法等,因为我没有这样的方法,并且在我正在查看的示例中没有提到如何创建它。

Also, once I get the solution, could someone please try and explain this code to me? I have read it through a lot of time and I just can't get myself to understand it, I'm a beginner.

另外,一旦我得到解决方案,有人可以尝试向我解释这段代码吗?我已经阅读了很多时间,但我无法让自己理解它,我是初学者。

采纳答案by Alexander.Iljushkin

Here's an example of custom expandable list view:

这是自定义可扩展列表视图的示例:

What you want to see if you apply this code in your new project:

如果在新项目中应用此代码,您希望看到什么:

enter image description here

在此处输入图片说明

create this code into activity

将此代码创建为活动

public class ExpActivity extends Activity
{

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Находим наш list 
        ExpandableListView listView = (ExpandableListView)findViewById(R.id.exListView);

        //Создаем набор данных для адаптера        
        ArrayList<ArrayList<String>> groups = new ArrayList<ArrayList<String>>();
        ArrayList<String> children1 = new ArrayList<String>();
        ArrayList<String> children2 = new ArrayList<String>();
        children1.add("Child_1");
        children1.add("Child_2");
        groups.add(children1);
        children2.add("Child_1");
        children2.add("Child_2");
        children2.add("Child_3");
        groups.add(children2);       
       //Создаем адаптер и передаем context и список с данными
        ExpListAdapter adapter = new ExpListAdapter(getApplicationContext(), groups);
        listView.setAdapter(adapter);
    }
} 

add expandableListView into main.xml

将 expandableListView 添加到 main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ExpandableListView
        android:id="@+id/exListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:indicatorLeft="250dp"
        android:indicatorRight="300dp"
    />
</LinearLayout>

create an adapter class

创建一个适配器类

public class ExpListAdapter extends BaseExpandableListAdapter {

    private ArrayList<ArrayList<String>> mGroups;
    private Context mContext;

    public ExpListAdapter (Context context,ArrayList<ArrayList<String>> groups){
        mContext = context;
        mGroups = groups;
    }

    @Override
    public int getGroupCount() {
        return mGroups.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return mGroups.get(groupPosition).size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return mGroups.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return mGroups.get(groupPosition).get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
                             ViewGroup parent) {

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.group_view, null);
        }

        if (isExpanded){
           //Изменяем что-нибудь, если текущая Group раскрыта
        }
        else{
            //Изменяем что-нибудь, если текущая Group скрыта
        }

        TextView textGroup = (TextView) convertView.findViewById(R.id.textGroup);
        textGroup.setText("Group " + Integer.toString(groupPosition));

        return convertView;

    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                             View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.child_view, null);
        }

        TextView textChild = (TextView) convertView.findViewById(R.id.textChild);
        textChild.setText(mGroups.get(groupPosition).get(childPosition));

        Button button = (Button)convertView.findViewById(R.id.buttonChild);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(mContext,"button is pressed",5000).show();
            }
        });

        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}

the names of methods and parameters is quite informative. methods getGroupView and getChildView returns View for pparentsand childrenaccordingly. using the parameter isExpanded in the method getGroupView, we ca, for instance, change the back of group in different states. using LayoutInflater we use custom layout for our list.

方法和参数的名称非常有用。方法 getGroupView 和 getChildView 返回 p 的视图,parentschildren相应地返回视图。使用getGroupView方法中的参数isExpanded,我们可以例如改变不同状态下的group的back。使用 LayoutInflater 我们为我们的列表使用自定义布局。

group_view.xml

group_view.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <TextView
            android:id="@+id/textGroup"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="20dp"
            android:textColor="@android:color/white"
            android:textStyle="bold"
            />
</LinearLayout>

child_view.xml

child_view.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
  <TextView
     android:id="@+id/textChild"
     android:layout_width="wrap_content"
     android:layout_height="40dp"
     android:layout_marginLeft="20dp"
     android:layout_marginTop="20dp"
     android:textColor="@android:color/white"
     />
  <Button
     android:id="@+id/buttonChild"
     android:layout_width="100dp"
     android:layout_height="40dp"
     android:layout_marginLeft="150dp"
     android:layout_marginTop="10dp"
     android:text="Button"
     android:focusable="false"
     />
</LinearLayout>

in the child view we added a button, in the adapter method getChildView controlling its pressed. in the similar way we can add buttons and other elements in group_view.xml .

在子视图中我们添加了一个按钮,在适配器方法 getChildView 中控制其按下。以类似的方式,我们可以在 group_view.xml 中添加按钮和其他元素。

also, we can pin listeners to our list.

此外,我们可以将听众固定到我们的列表中。

?OnChildClickListener — pressing on an element ?OnGroupCollapseListener – collapsing group ?OnGroupExpandListener – expanding group ?OnGroupClickListener – press on group

?OnChildClickListener — 按下一个元素 ?OnGroupCollapseListener – 折叠组 ?OnGroupExpandListener – 扩展组 ?OnGroupClickListener – 按下组

now lets look at groupIndicater - indicator of the group state. it's placement pointed in main.xml with parameters indicatorLeft, indicatorRigh - corresponding to left and right border. by default the indicator placed on the left side, what is not so cool.

现在让我们看看 groupIndicer - 组状态的指示器。它位于 main.xml 中,参数indicatorLeft、indicatorRigh - 对应于左右边框。默认情况下,指示器放置在左侧,有什么不那么酷的。

also we can add custom images, for that, we need to add indicator.xml in the folder drawable with this code.

我们也可以添加自定义图像,为此,我们需要使用此代码在 drawable 文件夹中添加 indicator.xml。

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_expanded="true"
          android:drawable="@drawable/imageOpen">
    </item>
    <item android:state_empty="true"
          android:drawable="@drawable/imageClose">
    </item>
</selector>

where imageOpen is for expanded group imageClose is for collapsed group

其中 imageOpen 用于展开组 imageClose 用于折叠组

next time we need to add a row for parameters of our list in main.xml

下次我们需要在 main.xml 中为列表的参数添加一行

android:groupIndicator="@drawable/indicator"