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

一、概述

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; 

  @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)

相关推荐

  • 支持多项选择的ExpandableListView

    本文实例为大家分享了ExpandableListView多项选择展示的具体代码,供大家参考,具体内容如下 目标(需求): 1. 创建一个可展开可收缩的列表: 2. 其列表项包含多个checkable的部件,当选择某一行时,该行包含的checkable的部件需要作出相应的变化: 3. 可以选择多个列表项,并且这些列表项可被读出 结果图: 实现: 1. 创建主layout用于规划列表显示.对于具体的列表项,为了实现的方便我们也创建一个layout文件. <?xml version="1.0&q

  • Android listview ExpandableListView实现多选,单选,全选,edittext实现批量输入的实例代码

    最近在项目开发中,由于项目的需求要实现一些列表的单选,多选,全选,批量输入之类的功能,其实功能的实现倒不是很复杂,需求中也没有涉及到复杂的动画什么之类,主要是解决列表数据复用的问题,解决好这个就可以了.下面是最近项目中涉及到的一些: listview实现多选.全选.取消全选: 下面是适配器,一开始在适配器的构造函数中,对数据进行初始化,同时定义一个集合用于管理listview的点击: class BatchAdpter extends BaseAdapter { private HashMap<

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

    一.概述 ExpandableListView是常用的一个控件,今天自己做了个小练习,主要需求是单选以及多选的实现,看似比较简单,但是还是比较复杂,把代码贴给大家,有这种需求的可以参考一下. 二.效果截图 三.实现过程 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.

  • Android实现单选与多选对话框的代码

    android开发中实现单选与多选对话框的代码非常简单,具体代码如下所示: public void myClick(View view) { // 单选对话框 //singleCheckDialog(); // 多选对话框 mulCheckDialog(); } private void mulCheckDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("标题"

  • Android DSelectorBryant 单选滚动选择器的实例代码

    单选滚动选择器.diy丰富.有阻尼效果.简单美观.触摸or点击模式 (Rolling Selector, Diy Rich, Damping Effect, Simple and Beautiful, Touch or Click Mode) Github地址 YangsBryant/DSelectorBryant (Github排版比较好,建议进入这里查看详情,如果觉得好,点个star吧!) 引入module allprojects { repositories { google() jcen

  • Android自定义单选多选下拉列表的实例代码

    发疯的产品要做一个可以单选和多选的下拉列表,陪你玩玩吧. 直接上效果: 实现方案: 我的思路是自定义一个类继承PopupWindow,里面的选项采用Listview,再结合一些动画来实现. 核心代码: public class MultiSelectPopupWindows extends PopupWindow { private Context context; private View parent; private List<Search> data; private int ySta

  • Android ListView构建支持单选和多选的投票项目

    引言 我们在android的APP开发中有时候会碰到提供一个选项列表供用户选择的需求,如在投票类型的项目中,我们提供一些主题给用户选择,每个主题有若干选项,用户对这些主题的选项进行选择,然后提交. 本文以一个支持单选和多选投票项目为例,演示了在一个ListView中如何构建CheckBox列表和RadioButton列表,并分析了实现的原理和思路,提供有需要的朋友参考. 项目的演示效果如下. 数据源 通常我们的数据源来自于数据库.首先,我们构建投票项目类SubjectItem. /** * 主题

  • Android使用AlertDialog实现的信息列表单选、多选对话框功能

    在使用AlertDialog实现单选和多选对话框时,分别设置setSingleChoiceItems()和setMultiChoiceItems()函数. 下面看主要的代码: 数据源数组: <resources> <!--单选--> <string-array name="arr_weather"> <item >晴</item> <item >多云</item> <item >小雨<

  • Android中ListView + CheckBox实现单选、多选效果

    还是先来看看是不是你想要的效果: 不废话,直接上代码,很简单,代码里都有注释 1 单选 public class SingleActivity extends AppCompatActivity { private ListView listView; private ArrayList<String> groups; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta

  • Android实现弹出列表、单选、多选框

    本文实例为大家分享了Android实现弹出列表.单选.多选框的具体代码,供大家参考,具体内容如下 效果图如下: 需要建一个menu xml布局如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schema

  • Android开发之获取单选与复选框的值操作示例

    本文实例讲述了Android开发之获取单选与复选框的值操作.分享给大家供大家参考,具体如下: 效果图: 布局文件: <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout

随机推荐