一、概述

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

二、效果截图

三、实现过程

activity_main.xml

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity" >

android:id="@+id/exlistview"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:listSelector="@android:color/transparent" >

group_item.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:descendantFocusability="blocksDescendants"

android:padding="10dp" >

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

android:id="@+id/id_group_checkbox"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_centerVertical="true" />

listview_item.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:descendantFocusability="blocksDescendants"

android:padding="10dp" >

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

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" />

MainAcitivity.java

public class MainActivity extends Activity {

private List> parentList = new ArrayList>();

private List>> childData = new ArrayList>>();

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 hashSet;

private void setListener()

{

exListView.setOnGroupExpandListener(new OnGroupExpandListener()

{

@Override

public void onGroupExpand(int groupPosition)

{

//存取已选定的集合

hashSet = new HashSet();

}

});

// 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 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 groupMap = new HashMap();

groupMap.put("groupText", "item" + i);

groupMap.put("isGroupCheckd", "No");

parentList.add(groupMap);

}

for (int i = 0; i < 10; i++)

{

List> list = new ArrayList>();

for (int j = 0; j < 4; j++)

{

Map map = new HashMap();

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();

}

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> list = childData

.get(groupPosition);

for (Map map : list)

{

map.put("isChecked", "Yes");

}

} else

{

groupBox.setChecked(false);

parentList.get(groupPosition)

.put("isGroupCheckd", "No");

List> list = childData

.get(groupPosition);

for (Map 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地址,欢迎下载:

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

list多选 android,Android ExpandableListView单选以及多选实现代码相关推荐

  1. android的listview多选功能,Android ListView实现单选及多选等功能示例

    本文实例讲述了Android ListView实现单选及多选等功能的方法.分享给大家供大家参考,具体如下: 在项目中也遇到过给ListView的item添加选择功能.比如一个网购APP,有个历史浏览页 ...

  2. Android CheckedTextView 实现单选与多选

    以下demo 地址 单选与双选实现的效果如下 CheckedTextView 继承的是 TextView 实现 Checkable 具有TextView 的属性 一般使用结合ListView xml ...

  3. 如何在Android Studio使用单选和复选框

    教学案例:设置个人基本信息 1.新建安卓项目 基于- Empty Activity模板创建安卓应用 - SetBasicInformation 2.准备一张图像素材 将背景图片拷贝到drawable目 ...

  4. 【Android】5.3 单选和复选

    分类:C#.Android.VS2015: 创建日期:2016-02-07 一.简介 1.CheckBox 复选 [Checked]属性:是否选中. 2.RadioButton 单选 [Checked ...

  5. android 单选、多选弹出菜单

    菜单单选窗口: import android.app.Activity; import android.app.AlertDialog; import android.content.DialogIn ...

  6. android单选对话框代码,Android实现单选与多选对话框的代码

    android开发中实现单选与多选对话框的代码非常简单,具体代码如下所示: public void myClick(View view) { // 单选对话框 //singleCheckDialog( ...

  7. android 流失布局,GitHub - hongyangAndroid/FlowLayout: [不再维护]Android流式布局,支持单选、多选等,适合用于产品标签等。...

    FlowLayout Android流式布局,支持单选.多选等,适合用于产品标签等. ##特色 以setAdapter形式注入数据 直接设置selector为background即可完成标签选则的切换 ...

  8. android开发 问卷调查案例_「Android问卷调查类型页面及逻辑实现」RadioButton、CheckBox、EditView、单选、多选、输入、...

    Android问卷调查类型页面及逻辑实现,RadioButton,CheckBox,EditView,RadioButton+EditView单选.多选.输入.单选加输入四种状态四种类型 问题简述:A ...

  9. Android 图片选择对话框,通过本地相册或照相机获得图片,可单选或多选,单选可设置是否裁剪

    AndroidPickPhotoDialog 项目地址: wanliyang1990/AndroidPickPhotoDialog 简介:Android 图片选择对话框,通过本地相册或照相机获得图片, ...

最新文章

  1. android 编译 oserror,Android-4.4.2 编译出错 OSError: [Errno 2] No such file or directory
  2. oracle怎么打代码,使用DOS打Oracle代码技巧
  3. OpenJDK将对Android开发产生怎样的影响?
  4. KDD_cup99 pytorch
  5. AngularJS $http 异步后台无法获取请求参数
  6. P1582 倒水(二进制)
  7. meta name id class 标签的区别
  8. LeetCode 202. 快乐数(快慢指针)
  9. 1.1.0-简介-P9-分布式ID生成器解决方案
  10. ssis 包配置组织程序_如何停止失控的SSIS程序包
  11. 依赖注入(DI)入门
  12. android怎么oauth2公版认证,Android中腾讯微博OAuth认证(一)---获取RequestToken
  13. 内Sane外Win:敏捷需要一流的项目经理
  14. 勤做眼保健操,减轻眼睛疲劳
  15. 微信H5公众号获取openid爬坑记
  16. [面试] 各大IT公司校园招聘程序猿笔试、面试题集锦
  17. 电磁兼容工程(Electromagnetic compatibility engineering Herry Ott )读书笔记--章12 数字电路的辐射
  18. HTML、CSS、JS、jQuery
  19. 《一升的眼泪》日语台词
  20. 生而为人,请善待每一个人

热门文章

  1. UE3 MemLeakCheck Tracking(内存泄露检测追踪)
  2. 标签选择器与字体连写
  3. 访问控制列表(二)配置命令
  4. Docker入门之五数据管理
  5. 树莓派进阶之路 (029) - 语音识别模块 LD3320(原创)
  6. IBM打造云访问量子计算机 规模仅相当于D-Wave系统的四百分之一
  7. 开发常用常用插件介绍
  8. Mysql函数Last_insert_id()的真正含义
  9. httpd配置文件详解(上)
  10. eclipse 优化。