在ExpandableListView

时间:2017-04-07 07:53:00

标签: android button expandablelistview

我正在使用ExpandableListView包含根据我获得的数据生成的组项和子项。现在我需要在每个生成的组的底部有一个按钮,其中有一个onClickListener,它调用一个函数,该函数必须知道该按钮所属的组。

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

这是我使用Android Studio的第一个项目,我一直试图解决这个问题。

以下是how the list looks like 的屏幕截图 我正在尝试添加按钮项目所在的按钮。

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

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;
    }
}

1 个答案:

答案 0 :(得分:1)

getChildView()方法是你想看的地方

第一个选项:

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

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

对于最后一个孩子,您创建一个包含按钮组件的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);
}