版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/S43565442/article/details/52796628
概述
最近项目要用到ExpandableListView实现全选功能,要求如下:
- 如果group点选,则child全选,如果child有一个不选,则group不选
- 如果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();
}
});
至此全文结束,仅此以记录