当前位置:主页 > 移动开发 > Android代码 >

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

时间:2022-11-12 10:12:03 | 栏目: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下载地址

您可能感兴趣的文章:

相关文章