ExpandableListView轻松实现全选

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/S43565442/article/details/52796628

概述

最近项目要用到ExpandableListView实现全选功能,要求如下:

  1. 如果group点选,则child全选,如果child有一个不选,则group不选
  2. 如果group不选,则child全不选,若一个group内的child全部点选,则group自动点选

效果如下:
这里写图片描述

代码实现

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.songyaru.testexpandablelistview.MainActivity">

    <Button
        android:id="@+id/get_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginTop="10dp"
        android:text="返回结果" />

    <ExpandableListView
        android:id="@+id/exlv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/get_result"
        android:layout_marginTop="10dp" />
</RelativeLayout>

item_group.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="blocksDescendants"
    android:padding="10dp">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerVertical="true"
        android:layout_marginLeft="25dp"
        android:background="@mipmap/group" />


    <TextView
        android:id="@+id/tv_group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/iv_icon"
        android:text="焊接"
        android:textSize="18sp" />

    <CheckBox
        android:id="@+id/cb_group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />

</RelativeLayout>

item_child.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">

    <ImageView
        android:id="@+id/iv_child"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerVertical="true"
        android:layout_marginLeft="30dp"
        android:background="@mipmap/child" />


    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/iv_child"
        android:text="child"
        android:textSize="18sp" />

    <CheckBox
        android:id="@+id/cb_child"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:clickable="false"
        android:focusable="false" />

</RelativeLayout>

实现功能只需三步:
1. 首先为ExpandableListView设置适配器
2. 再对ExpandableListView设置监听
3. 获取返回结果

适配器设置

    public MyAdapter(Context context, List<String> listParent, List<String> listChildren
            , List<Map<String, Boolean>> groupCheckBox, List<List<Map<String, Boolean>>> childCheckBox, TextView tvOk) {
        inflater = LayoutInflater.from(context);
        this.listParent = listParent;
        this.listChildren = listChildren;
        this.groupCheckBox = groupCheckBox;
        this.childCheckBox = childCheckBox;
        this.tvOk = tvOk;
    }
    @Override
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.item_group, null);
        }
        ImageView iv = (ImageView) convertView.findViewById(R.id.iv_icon);
        TextView tv = (TextView) convertView.findViewById(R.id.tv_group);
        iv.setImageResource(R.mipmap.group);
        tv.setText(listParent.get(groupPosition));
        tv.setTextColor(Color.parseColor("#418dda"));
        final CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.cb_group);
        checkBox.setChecked(groupCheckBox.get(groupPosition).get(groupCB));

        checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean isChecked = checkBox.isChecked();
                groupCheckBox.get(groupPosition).put(groupCB, isChecked);
                changChildStates(groupPosition, isChecked);
                notifyDataSetChanged();
            }
        });
        return convertView;
    }
 @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.item_child, null);
        }
        TextView tv = (TextView) convertView.findViewById(R.id.tv_name);
        ImageView iv = (ImageView) convertView.findViewById(R.id.iv_child);
        tv.setText(listChildren.get(groupPosition).get(childPosition));
        tv.setTextColor(Color.parseColor("#FF0000"));
        iv.setImageResource(R.mipmap.child);
        CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.cb_child);
        checkBox.setChecked(childCheckBox.get(groupPosition).get(childPosition).get(childCB));
        return convertView;
    }

设置监听

exlv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                if (childCheckBox.get(groupPosition).get(childPosition).get(childCB)) {
                    childCheckBox.get(groupPosition).get(childPosition).put(childCB, false);
                    //child有一个不选则group也不选
                    if (groupCheckBox.get(groupPosition).get(groupCB)) {
                        groupCheckBox.get(groupPosition).put(groupCB, false);
                        for (int i = 0; i < childCheckBox.get(groupPosition).size(); i++) {
                            if (childPosition != i) {
                                childCheckBox.get(groupPosition).get(i).put(childCB, true);
                            }
                        }
                    }
                } else {
                    int count = 0;
                    childCheckBox.get(groupPosition).get(childPosition).put(childCB, true);
                    for (int i = 0; i < childCheckBox.get(groupPosition).size(); i++) {
                        if (childCheckBox.get(groupPosition).get(i).get(childCB)) {
                            count += 1;
                        }
                    }
                    //如果child都被选了,则group也选择
                    if (count == childCheckBox.get(groupPosition).size()) {
                        groupCheckBox.get(groupPosition).put(groupCB, true);
                    }
                }
                adapter.notifyDataSetChanged();
                return false;
            }
        });

获取返回结果

String groupNames = "";
        String childNames = "";
        String groupNamesResult = "";
        String childNamesResult = "";
        for (int i = 0; i < groupCheckBox.size(); i++) {
            if (groupCheckBox.get(i).get(groupCB)) {
                groupNames = groupNames + "," + listParent.get(i);
            } else {
                for (int j = 0; j < childCheckBox.get(i).size(); j++) {
                    if (childCheckBox.get(i).get(j).get(childCB)) {
                        childNames = childNames + "," + listChildren.get(i).get(j);
                    }
                }
            }
        }

        if (!TextUtils.isEmpty(groupNames)) {
            groupNamesResult = groupNames.substring(1);
        }
        if (!TextUtils.isEmpty(childNames)) {
            childNamesResult = childNames.substring(1);
        }

        DebugUtil.E(TAG, "组names=" + groupNamesResult);
        DebugUtil.E(TAG, "成员names=" + childNamesResult);

当然,想要什么样的结果,可以自己设定,如果还想要展示选择的人数,可以在适配器的getChildView方法里设置:

RelativeLayout rlChild = (RelativeLayout) convertView.findViewById(R.id.rl_child);
    rlChild.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            CheckBox checkBox = (CheckBox) v.findViewById(R.id.cb_child);

            checkBox.toggle();
            if (childCheckBox.get(groupPosition).get(childPosition).get(childCB)) {
                childCheckBox.get(groupPosition).get(childPosition).put(childCB, false);
                if (groupCheckBox.get(groupPosition).get(groupCB)) {
                    groupCheckBox.get(groupPosition).put(groupCB, false);
                    for (int i = 0; i < childCheckBox.get(groupPosition).size(); i++) {
                        if (childPosition != i) {
                            childCheckBox.get(groupPosition).get(i).put(childCB, true);
                        }
                    }
                }

                num--;
                if (num != 0) {
                    tvOk.setText("确定(" + num + ")");
                } else {
                    tvOk.setText("确定");
                }
            } else {
                int count = 0;
                childCheckBox.get(groupPosition).get(childPosition).put(childCB, true);
                for (int i = 0; i < childCheckBox.get(groupPosition).size(); i++) {
                    if (childCheckBox.get(groupPosition).get(i).get(childCB)) {
                        count += 1;
                    }
                }
                if (count == childCheckBox.get(groupPosition).size()) {
                    groupCheckBox.get(groupPosition).put(groupCB, true);
                }

                num++;
                if (num != 0) {
                    tvOk.setText("确定(" + num + ")");
                } else {
                    tvOk.setText("确定");
                }
            }
            notifyDataSetChanged();
        }
    });

至此全文结束,仅此以记录

猜你喜欢

转载自blog.csdn.net/S43565442/article/details/52796628