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
- Android ExpandableListView单选以及多选实现
- android listview ExpandableListView实现多选,单选,全选,edittext实现批量输入
- ExpandableListView结合CheckBox实现单选的完整示例
- android ExpandableListView 设置所有子条目单选
- android RadioGroup实现单选以及默认选中
- ExpandableListView万能adapter封装轻松实现分组列表及单选效果
- android ExpandableListView实现
- ExpandableListView使用(二)-ExpandableListView+CheckBox实现组选列表
- android 单选,复选按钮,以及toast
- Android 实现单选列表
- android listView实现单选
- Android 实现单选对话框
- Android ListView实现单选
- 自定义ExpandableListView以及实现其分页
- Android ListView 使用checkbox 实现 单选、多选操作
- 【Android】ListView的单选、多选的实现
- Android列表List多选何单选实现
- Android实现LIstView条目单选和多选RadioButton
- 飞鸽传书(IPMSG)协议(翻译稿)
- 博客开启日记
- 计算文本的高度并显示在label上出现灰色的线条
- opencv contrib怎么用
- oracle学习之bulk collect用法
- Android ExpandableListView单选以及多选实现
- 简单工厂(Simple Factory)模式
- java日常技巧
- 人格魅力养成
- Java程序员面试宝典(第4版)——互动出版网
- TCP3次握手和backlog溢出
- java中的WeakReference
- Java NIO原理图文分析及代码实现
- 保持一生的友谊