软件编程
位置:首页>> 软件编程>> Android编程>> Android ExpandableListView单选以及多选实现代码

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

作者:不年少还青春  发布时间:2023-01-14 20:45:51 

标签:Android,单选,多选

一、概述

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

来源:https://blog.csdn.net/Hello201404/article/details/48546387

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com