在 ExpandableListView 中为每个组添加一个按钮

Adding a button for each group in an ExpandableListView

我正在使用 ExpandableListView 组项目和 child 从我得到的数据生成的项目。现在我需要在每个生成的组的底部有一个按钮,它带有一个 onClickListener,它调用一个函数,该函数必须知道该按钮属于哪个组。

将其添加到我的 list_group.xml 布局文件将在 示例数据标题 -Header 上添加按钮并将其添加到我的 list_item.xml 会将它添加到每个 示例数据 -TextView 元素。

这是我使用 Android Studio 的第一个项目,我在尝试解决问题时遇到了困难。

这是how the list looks like的截图
我正在尝试添加 button 项所在的按钮。

这是我用数据填充列表的函数:

private void prepareListData(ccyPair[] ccyPairs) {
            listDataHeader = new ArrayList<String>();
            listDataChild = new HashMap<String, List<String>>();
            int counter = 0;
            // Adding child data
            for (ccyPair p : ccyPairs){
                listDataHeader.add("Sample Data Title");
                List<String> tempExpInfo = new ArrayList<String>();
                tempExpInfo.add("Sample data");
                tempExpInfo.add("Sample data");
                tempExpInfo.add("Sample data");
                tempExpInfo.add("Sample data");
                tempExpInfo.add("Sample data");
                tempExpInfo.add("Sample data");
                tempExpInfo.add("BUTTON");
                listDataChild.put(listDataHeader.get(counter), tempExpInfo);
                counter++;
            }
        }

list_group.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="8dp"
    android:background="@color/colorExpandableList">


    <TextView
        android:id="@+id/lblListHeader"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:textSize="17dp"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:background="@color/colorExpandableList"
        android:textColor="#2282c1"
        android:layout_alignParentTop="true"/>

</RelativeLayout>

list_item.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorExpandableList"><![CDATA[
    android:orientation="vertical" >



    ]]>

    <TextView
        android:id="@+id/lblListItem"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorExpandableList"
        android:paddingBottom="5dp"
        android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"
        android:paddingTop="5dp"
        android:textSize="17dip" />


</LinearLayout>

和 ExpandableListAdapter

public class ExpandableListAdapter extends BaseExpandableListAdapter {

    private Context _context;
    private List<String> _listDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<String, List<String>> _listDataChild;

    public ExpandableListAdapter(Context context, List<String> listDataHeader, HashMap<String, List<String>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }

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

    @Override
    public View getChildView(int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }

        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }

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

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

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

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
        }

        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);

        return convertView;
    }

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

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

getChildView() 方法是您想要查看的地方

第一个选项:

在 getChildView() 方法中,您必须区分要膨胀的视图。

if(isLastChild){
    convertView = Inflater.inflate(R.layout.list_item_with_button, null);
} else {
    convertView = Inflater.inflate(R.layout.list_item, null);
}

对于最后一个 child,您创建了一个包含按钮组件的 list_item_with_button.xml。然后,您可以检查 isLastChild 布尔标志来膨胀这个新布局,使按钮位于最后一个位置。

第二个选项:您可以编辑现有的 list_item.xml 并向其添加一个按钮,您可以通过

在最后位置显示该按钮
View button = convertView.findViewById(R.id.myButton);
if(isLastChild){
    v.setVisibility(View.VISIBLE);
} else {
    v.setVisibility(View.GONE);
}