怎么在Android中利用ExpandableListView实现单选和多选

发布时间:2021-05-24 18:07:26 作者:Leah
来源:亿速云 阅读:207

这期内容当中小编将会给大家带来有关怎么在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; 
  } 
}

Android是什么

Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

上述就是小编为大家分享的怎么在Android中利用ExpandableListView实现单选和多选了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. 在HTML中select标签如何实现单选和多选
  2. 怎么在小程序中实现单选多选功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android expandablelistview

上一篇:怎么在Android中利用ExpandableListView实现下拉刷新功能

下一篇:如何在Java中使用MessageFormat匹配短信模板

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》