Android ExpandableListView单选以及多选实现

来源:互联网 发布:java实现打印功能 编辑:程序博客网 时间:2024/06/15 11:18

一、概述

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

二、效果截图


三、实现过程

activity_main.xml

<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

<?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

<?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

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;@Overrideprotected 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(){@Overridepublic void onGroupExpand(int groupPosition){//存取已选定的集合hashSet = new HashSet<String>();}});// ExpandableListView的Group的点击事件exListView.setOnGroupClickListener(new OnGroupClickListener(){@Overridepublic boolean onGroupClick(ExpandableListView parent, View v,int groupPosition, long id){// 可以写点击后实现的功能return false;}});// ExpandableListView的child的点击事件exListView.setOnChildClickListener(new OnChildClickListener(){@Overridepublic 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 {@Overridepublic Object getChild(int groupPosition, int childPosition){// TODO Auto-generated method stubreturn childData.get(groupPosition).get(childPosition);}@Overridepublic long getChildId(int groupPosition, int childPosition){// TODO Auto-generated method stubreturn childPosition;}@Overridepublic 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;}@Overridepublic int getChildrenCount(int groupPosition){// TODO Auto-generated method stubreturn childData.get(groupPosition).size();}@Overridepublic Object getGroup(int groupPosition){return parentList.get(groupPosition);}@Overridepublic int getGroupCount(){// TODO Auto-generated method stubreturn parentList.size();}@Overridepublic long getGroupId(int groupPosition){// TODO Auto-generated method stubreturn groupPosition;}@Overridepublic 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(){@Overridepublic void onClick(View v){CheckBox groupBox = (CheckBox) v.findViewById(R.id.id_group_checkbox);if (!isExpanded){//展开某个group viewexListView.expandGroup(groupPosition);} else{//关闭某个group viewexListView.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;}@Overridepublic boolean hasStableIds(){return true;}@Overridepublic 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 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 拼多多收货地址填错了怎么办 京东订单申请退款已发货怎么办 手机播放声音的地方进水了怎么办 手机出声音的地方进水了怎么办 手机听声音的地方进水了怎么办 装修公司我只要基装她不肯怎么办 雄迈未来家庭忘记账号和密码怎么办 地方文件和国家政策有冲突怎么办? 网上贷款放款成功没有到账怎么办 我来贷放款中不到账怎么办 手持身份证被别人网贷了怎么办 身份证被别人做了网贷怎么办 身份证丢了被别人网贷了怎么办 户口身份证被注销了网贷怎么办 首付交了贷款办不下来怎么办 付首付后贷款没有批下来怎么办 交了首付贷款没有办下来怎么办 买房交了首付贷款没批下来怎么办 交完首付办不下来贷款怎么办 房子交了首付贷款办不下来怎么办 浦发银行办理房贷流水不够怎么办 房贷审批过程中突然换工作怎么办 建行快贷结清后无额度怎么办 建设银行快贷逾期2个月怎么办 全职速卖通一个月没订单要怎么办 买家点的好评写的差评怎么办 手机流量把话费扣没了怎么办 街电忘记还怎么办3天了 街电1个星期没还怎么办 苹果手机设置密码忘记问题了怎么办 买房付了首付后无法办按揭怎么办 苹果x导入通讯录不显示名字怎么办 苹果切换了id通讯录没有了怎么办 换了id通讯录记录没有了怎么办 4s升级系统通讯录没了怎么办 手机接听声音小怎么办但插耳机正常 苹果6p手机听筒声音小怎么办 苹果6s接电话对方声音小怎么办 iphone死机了怎么办关机也关不了 苹果7p卡死sos了怎么办 苹果x死机且屏幕失灵怎怎么办