前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android ExpandableListView单选以及多选实现代码

Android ExpandableListView单选以及多选实现代码

作者头像
砸漏
发布2020-11-05 11:20:31
9610
发布2020-11-05 11:20:31
举报
文章被收录于专栏:恩蓝脚本

一、概述

ExpandableListView是常用的一个控件,今天自己做了个小练习,主要需求是单选以及多选的实现,看似比较简单,但是还是比较复杂,把代码贴给大家,有这种需求的可以参考一下。

二、效果截图

三、实现过程

activity_main.xml

代码语言:javascript
复制
<LinearLayout 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" 
  android:orientation="vertical" 
  tools:context=".MainActivity"   
 
  <ExpandableListView 
    android:id="@+id/exlistview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:listSelector="@android:color/transparent"   
  </ExpandableListView  
 
</LinearLayout  

group_item.xml

代码语言:javascript
复制
<?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"   
 
  <TextView 
    android:id="@+id/id_group_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_marginLeft="10dp" 
    android:padding="10dp" 
    android:text="hao" 
    android:textColor="@android:color/black" 
    android:textIsSelectable="true" 
    android:textSize="15sp"   
  </TextView  
 
  <CheckBox 
    android:id="@+id/id_group_checkbox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true" /  
 
</RelativeLayout  

listview_item.xml

代码语言:javascript
复制
<?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"   
 
  <TextView 
    android:id="@+id/id_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:padding="10dp" 
    android:layout_marginLeft="30dp" 
    android:textColor="#55acac" 
    android:textIsSelectable="true" 
    android:textSize="15sp"   
  </TextView  
 
  <CheckBox 
    android:id="@+id/id_checkbox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:clickable="false" 
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true" /  
 
</RelativeLayout  

MainAcitivity.java

代码语言:javascript
复制
public class MainActivity extends Activity { 
private List<Map<String, String   parentList = new ArrayList<Map<String, String  (); 
private List<List<Map<String, String    childData = new ArrayList<List<Map<String, String   (); 
private ExpandableListView exListView; 
private Context context = this; 
private MyAdapter adapter; 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
initView(); 
initData(); 
setListener(); 
} 
/** 
* 记录正在选中的子listview的item条目 用hashset是为了去除重复值 
*/ 
private HashSet<String  hashSet; 
private void setListener() 
{ 
exListView.setOnGroupExpandListener(new OnGroupExpandListener() 
{ 
@Override 
public void onGroupExpand(int groupPosition) 
{ 
//存取已选定的集合 
hashSet = new HashSet<String (); 
} 
}); 
// ExpandableListView的Group的点击事件 
exListView.setOnGroupClickListener(new OnGroupClickListener() 
{ 
@Override 
public boolean onGroupClick(ExpandableListView parent, View v, 
int groupPosition, long id) 
{ 
// 可以写点击后实现的功能 
return false; 
} 
}); 
// ExpandableListView的child的点击事件 
exListView.setOnChildClickListener(new OnChildClickListener() 
{ 
@Override 
public boolean onChildClick(ExpandableListView parent, View v, 
int groupPosition, int childPosition, long id) 
{ 
Map<String, String  map = childData.get(groupPosition).get( 
childPosition); 
String childChecked = map.get("isChecked"); 
if ("No".equals(childChecked)) 
{ 
map.put("isChecked", "Yes"); 
hashSet.add("选定" + childPosition); 
} else 
{ 
map.put("isChecked", "No"); 
if (hashSet.contains("选定" + childPosition)) 
{ 
hashSet.remove("选定" + childPosition); 
} 
} 
System.out.println("选定的长度==1" + hashSet.size()); 
System.out.println("选定的长度==2" 
+ childData.get(groupPosition).size()); 
if (hashSet.size() == childData.get(groupPosition).size()) 
{ 
parentList.get(groupPosition).put("isGroupCheckd", "Yes"); 
} else 
{ 
parentList.get(groupPosition).put("isGroupCheckd", "No"); 
} 
adapter.notifyDataSetChanged(); 
return false; 
} 
}); 
} 
// 初始化数据 
private void initData() 
{ 
for (int i = 0; i < 10; i++) 
{ 
Map<String, String  groupMap = new HashMap<String, String (); 
groupMap.put("groupText", "item" + i); 
groupMap.put("isGroupCheckd", "No"); 
parentList.add(groupMap); 
} 
for (int i = 0; i < 10; i++) 
{ 
List<Map<String, String   list = new ArrayList<Map<String, String  (); 
for (int j = 0; j < 4; j++) 
{ 
Map<String, String  map = new HashMap<String, String (); 
map.put("childItem", "childItem" + j); 
map.put("isChecked", "No"); 
list.add(map); 
} 
childData.add(list); 
} 
adapter = new MyAdapter(); 
exListView.setAdapter(adapter); 
exListView.expandGroup(0); 
hashSet = new HashSet<String (); 
} 
private void initView() 
{ 
exListView = (ExpandableListView) findViewById(R.id.exlistview); 
} 
/** 
* 适配adapter 
*/ 
private class MyAdapter extends BaseExpandableListAdapter { 
@Override 
public Object getChild(int groupPosition, int childPosition) 
{ 
// TODO Auto-generated method stub 
return childData.get(groupPosition).get(childPosition); 
} 
@Override 
public long getChildId(int groupPosition, int childPosition) 
{ 
// TODO Auto-generated method stub 
return childPosition; 
} 
@Override 
public View getChildView(int groupPosition, int childPosition, 
boolean isLastChild, View convertView, ViewGroup parent) 
{ 
ViewHolder holder = null; 
if (convertView == null) 
{ 
holder = new ViewHolder(); 
convertView = View.inflate(context, R.layout.listview_item, 
null); 
holder.childText = (TextView) convertView 
.findViewById(R.id.id_text); 
holder.childBox = (CheckBox) convertView 
.findViewById(R.id.id_checkbox); 
convertView.setTag(holder); 
} else 
{ 
holder = (ViewHolder) convertView.getTag(); 
} 
holder.childText.setText(childData.get(groupPosition) 
.get(childPosition).get("childItem")); 
String isChecked = childData.get(groupPosition).get(childPosition) 
.get("isChecked"); 
if ("No".equals(isChecked)) 
{ 
holder.childBox.setChecked(false); 
} else 
{ 
holder.childBox.setChecked(true); 
} 
return convertView; 
} 
@Override 
public int getChildrenCount(int groupPosition) 
{ 
// TODO Auto-generated method stub 
return childData.get(groupPosition).size(); 
} 
@Override 
public Object getGroup(int groupPosition) 
{ 
return parentList.get(groupPosition); 
} 
@Override 
public int getGroupCount() 
{ 
// TODO Auto-generated method stub 
return parentList.size(); 
} 
@Override 
public long getGroupId(int groupPosition) 
{ 
// TODO Auto-generated method stub 
return groupPosition; 
} 
@Override 
public View getGroupView(final int groupPosition, 
final boolean isExpanded, View convertView, ViewGroup parent) 
{ 
ViewHolder holder = null; 
if (convertView == null) 
{ 
holder = new ViewHolder(); 
convertView = View.inflate(context, R.layout.group_item, null); 
holder.groupText = (TextView) convertView 
.findViewById(R.id.id_group_text); 
holder.groupBox = (CheckBox) convertView 
.findViewById(R.id.id_group_checkbox); 
convertView.setTag(holder); 
} else 
{ 
holder = (ViewHolder) convertView.getTag(); 
} 
holder.groupText.setText(parentList.get(groupPosition).get( 
"groupText")); 
final String isGroupCheckd = parentList.get(groupPosition).get( 
"isGroupCheckd"); 
if ("No".equals(isGroupCheckd)) 
{ 
holder.groupBox.setChecked(false); 
} else 
{ 
holder.groupBox.setChecked(true); 
} 
/* 
* groupListView的点击事件 
*/ 
holder.groupBox.setOnClickListener(new OnClickListener() 
{ 
@Override 
public void onClick(View v) 
{ 
CheckBox groupBox = (CheckBox) v 
.findViewById(R.id.id_group_checkbox); 
if (!isExpanded) 
{ 
//展开某个group view 
exListView.expandGroup(groupPosition); 
} else 
{ 
//关闭某个group view 
exListView.collapseGroup(groupPosition); 
} 
if ("No".equals(isGroupCheckd)) 
{ 
exListView.expandGroup(groupPosition); 
groupBox.setChecked(true); 
parentList.get(groupPosition).put("isGroupCheckd", 
"Yes"); 
List<Map<String, String   list = childData 
.get(groupPosition); 
for (Map<String, String  map : list) 
{ 
map.put("isChecked", "Yes"); 
} 
} else 
{ 
groupBox.setChecked(false); 
parentList.get(groupPosition) 
.put("isGroupCheckd", "No"); 
List<Map<String, String   list = childData 
.get(groupPosition); 
for (Map<String, String  map : list) 
{ 
map.put("isChecked", "No"); 
} 
} 
notifyDataSetChanged(); 
} 
}); 
return convertView; 
} 
@Override 
public boolean hasStableIds() 
{ 
return true; 
} 
@Override 
public boolean isChildSelectable(int groupPosition, int childPosition) 
{ 
return true; 
} 
} 
private class ViewHolder { 
TextView groupText, childText; 
CheckBox groupBox, childBox; 
} 
} 

四、总结及注意点

1、设置CheckBox的点击事件,而非别的

2、exListView.collapseGroup(groupPosition); 关闭正展开的子ListView.

这是demo地址,欢迎下载:

Demo下载地址

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档