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

2020-11-05 11:20:31 浏览数 (1)

一、概述

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下载地址

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

0 人点赞