首页 > 系统 > Android > 正文

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

2019-10-21 21:49:45
字体:
来源:转载
供稿:网友

一、概述

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

二、效果截图

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

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


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表