ExpandableListView的基本用法

2024-09-08 08:48

本文主要是介绍ExpandableListView的基本用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QQ上的好友列表在Android怎么实现,有一个最简单的方法,那就是ExpandableListView,下面简单介绍一下ExpandableListview的用法。

先看看效果图,没有找到大小合适的图片,所以凑合着看吧。




  
 一、准备工作(界面,和需要的数据)
   
  
     <? xml   version = "1.0"   encoding =   "utf-8" ?>
  < resources >
    < string-array name = "groups" >
        < item > 蜀国 </ item >
        < item > 魏国 </ item >
        < item > 吴国 </ item >
    </ string-array >
   
    < string-array name = "people_shu" >
        < item > 刘备 </ item >
        < item > 马超 </ item >
        < item > 赵云 </ item >
        < item > 黄忠 </ item >
        < item > 诸葛亮 </ item >
    </ string-array >
   
    < string-array name = "people_shu_zhiwu" >
        < item > 主公 </ item >
        < item > 天威将军 </ item >
        < item > 护国将军 </ item >
        < item > 后将军 </ item >
        < item > 丞相 </ item >
    </ string-array >
   
    < string-array name = "people_wei" >
        < item > 郭嘉 </ item >
        < item > 曹丕 </ item >
        < item > 曹植 </ item >
        < item > 贾诩 </ item >
    </ string-array >
   
   < string-array name = "people_wei_zhiwu" >
        < item > 军师 </ item >
        < item > 大世子 </ item >
        < item > 二世子 </ item >
        < item > 参谋 </ item >
    </ string-array >
   
  < string-array name = "people_wu" >
        < item > 周瑜 </ item >
    </ string-array >
   
    < string-array name = "people_wu_zhiwu" >
        < item > 大都督 </ item >
    </ string-array >
   
</ resources >
    
   不知道为什么我这个直接写在Strings.xml文件中没效果,非要重新创建一个array.xml文件.


 
  二、主界面xml
      <? xml   version = "1.0"   encoding =   "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "vertical"
    >
   
   
    < TextView
        android:id = "@+id/tv_title"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text = "ExpandableListView示例"
        />
   
   
   
    < ExpandableListView
        android:layout_marginTop = "10dp"
        android:id = "@+id/ex_lv"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        android:layout_marginLeft = "16dp"
        android:layout_marginRight = "16dp"
        android:scrollbars = "none" >
             
       
    </ ExpandableListView >
   
   

</ LinearLayout >

    这里就顺带说说 ExpandableListView的一些属性
      android:scrollbars = "none" //设置下拉条消失
       android:listSelector = "#00000000" //设置点击时的颜色
     

      android:divider = "@null" //这两个属性设置分割线
      android:dividerHeight = "1px"
   

   
三、 一级item的xml布局
        <? xml   version = "1.0"   encoding =   "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "horizontal"
   >
   
   
   < RelativeLayout
        android:id = "@+id/group_layout"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:paddingBottom = "10dp"
        android:paddingTop = "10dp"
        android:background = "@drawable/text_item_bg" >
       
       
        < TextView
        android:id = "@+id/tv_title"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:textSize = "20sp"
        android:layout_marginLeft = "15dp"
       />
   
   
     < TextView
         android:layout_toRightOf = "@id/tv_title"
        android:id = "@+id/tv_count"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:textSize = "20sp"
        android:layout_marginLeft = "10dp" />
    
    
      < ImageView
            android:id = "@+id/group_state"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:layout_alignParentRight = "true"
            android:layout_centerVertical = "true"
            android:layout_marginRight = "10dp" />
      
    </ RelativeLayout >
   

</ LinearLayout >


   PS:如果想要改变一级item的外观,可以写一个shaper图形资源文件(如下所示),然后用background引用。

    <? xml version = "1.0" encoding = "utf-8" ?>
< shape xmlns:android = "http://schemas.android.com/apk/res/android" >

    < solid android:color = "#ffffff" />

    < corners
        android:bottomLeftRadius = "4dp"
        android:bottomRightRadius = "4dp"
        android:topLeftRadius = "4dp"
        android:topRightRadius = "4dp" />

</ shape >
      
四、二级item的xml布局
      <? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "horizontal"
    android:background = "@drawable/text_item_bg" >
   
   
    < ImageView
        android:id = "@+id/child_icon"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_marginLeft = "10dp" />
   
   
    < LinearLayout
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:orientation = "vertical" >
       
        < TextView
            android:id = "@+id/child_name"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:textSize = "20sp"
            />

        < TextView
            android:id = "@+id/child_desc"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:textSize = "20sp" />
       
    </ LinearLayout >
     
   

</ LinearLayout >


  
 五、一些关键的地方

        1. 数据的封装


            画图理解
  
             
    //每一个主视图中所包含的子视图个数(子视图中的名称个数)
          for ( int i=0;i< childNameArrays . length ;i++){
             

              //每一个子视图的item组成的集合
              List<Item> list = new ArrayList<Item>();
             
              //得到子视图中名称的String数组,有多少个名称就代表有多少个子item,所以可以用这个String数组来表示总共的子item
              String[] childs = getResources().getStringArray( childNameArrays [i]);
              //得到子视图中对应的描述信息
              String[] desc = getResources().getStringArray( mDescDatas [i]);
             
              //封装每一个具体的子item
              for ( int j=0;j<childs. length ;j++){
                 
                  Item item = new Item();
                  item.setName(childs[j]);
                  item.setDesc(desc[j]);
                  item.setResId( mImageDatas [i][j]);
                 
                  //添加到所有子item的集合中
                  list.add(item);
                 
              }
              //添加到allDatas中
              allDatas .add(list);
             
          }

  
      
 2.   BaseExpandableListAdapter的基本方法
           class   MyAdapter   extends   BaseExpandableListAdapter{

         
          //一级item的总数
          @Override
          public int getGroupCount() {
              return allDatas .size();
         }

          //二级item的总数
          @Override
          public int getChildrenCount( int groupPosition) {
              return allDatas .get(groupPosition).size();
         }

         
          //获得一级item的内容
          @Override
          public List<Item> getGroup( int groupPosition) {
              return allDatas .get(groupPosition);
         }

          @Override
          public Item getChild( int groupPosition, int childPosition) {
              return allDatas .get(groupPosition).get(childPosition);
         }

         
          //获取一级item的Id
          @Override
          public long getGroupId( int groupPosition) {
              return groupPosition;
         }

          @Override
          public long getChildId( int groupPosition, int childPosition) {
              return childPosition;
         }

         
          
          @Override
          public boolean hasStableIds() {
              return false ;
         }

          @Override
          public View getGroupView( int groupPosition, boolean isExpanded,
                 View convertView, ViewGroup parent) {
             
             GroupViewHolder mGroupViewHolder = null ;
             
              if (convertView== null ){
                 
                 convertView = mInflater .inflate(R.layout. group_item , null );
                 mGroupViewHolder = new GroupViewHolder();
                 
                  //找到控件
                 mGroupViewHolder. mGroupName = (TextView) convertView.findViewById(R.id. tv_title );
                 mGroupViewHolder. mGroupChilds = (TextView) convertView.findViewById(R.id. tv_count );
                 mGroupViewHolder. mImageView = (ImageView) convertView.findViewById(R.id. group_state );
                 
                 
                 convertView.setTag(mGroupViewHolder);
                 
             } else {
                 
                 mGroupViewHolder = (GroupViewHolder) convertView.getTag();
                 
             }
             
              //设置内容
             mGroupViewHolder. mGroupName .setText( groups_title [groupPosition]);
              //每组对应的孩子总数  "[" + mData.get(groupPosition).size() + "]"
             mGroupViewHolder. mGroupChilds .setText( "[" + allDatas .get(groupPosition).size()+ "]" );
              //变换上下的箭头
              if (isExpanded){
                 mGroupViewHolder. mImageView .setBackgroundResource( group_state_array [1]);
                 
             } else {
                 mGroupViewHolder. mImageView .setBackgroundResource( group_state_array [0]);
             }
             
              return convertView;
         }

          @Override
          public View getChildView( int groupPosition, int childPosition,
                  boolean isLastChild, View convertView, ViewGroup parent) {
             
             ChildViewHolder mChildViewHolder = null ;
              if (convertView== null ){
                 
                 convertView = mInflater .inflate(R.layout. child_item , null );
                 mChildViewHolder = new ChildViewHolder();
                 
                 mChildViewHolder. mName = (TextView) convertView.findViewById(R.id. child_name );
                 mChildViewHolder. mDesc =  (TextView) convertView.findViewById(R.id. child_desc );
                 mChildViewHolder. mIcon = (ImageView) convertView.findViewById(R.id. child_icon );
                 
                 convertView.setTag(mChildViewHolder);
                 
             } else {
                 
                 mChildViewHolder = (ChildViewHolder) convertView.getTag();
             }
             
             Bitmap bitmap = BitmapFactory.decodeResource(getResources(), getChild(groupPosition, childPosition).getResId());
             Bitmap roundCornerBitmap = getRoundCornerBitmap(bitmap, 30);
             
             mChildViewHolder. mIcon .setImageBitmap(roundCornerBitmap);
             mChildViewHolder. mName .setText(getChild(groupPosition, childPosition).getName());
             mChildViewHolder. mDesc .setText(getChild(groupPosition, childPosition).getDesc());
             
             
             
              return convertView;
         }

          @Override
          public boolean isChildSelectable( int groupPosition, int childPosition) {
              return true ;
         }
         
    }
    
     class GroupViewHolder {
         
         TextView mGroupName ;
         TextView mGroupChilds ;
         ImageView mImageView ;
         
         
    }
    
     class ChildViewHolder{
         
         ImageView mIcon ;
         TextView mDesc ;
         TextView mName ;
         
    }

    3.去掉默认的左边的箭头
       //设置默认左边的箭头样式
         mExpandableListView .setGroupIndicator( null );

   4. 默认展开
         //默认打开第一个分组
        mExpandableListView .expandGroup(0);

       注意一定要在 设置适配器后写上面的一行代码
         mExpandableListView .setAdapter( adapter );

      循环展开全部的
       exListView.setAdapter(exlvAdapter);

   //遍历所有group,将所有项设置成默认展开

   int groupCount = exListView.getCount();

   for (int i=0; i<groupCount; i++) {

       exListView.expandGroup(i);

       };

   

    资源下载:代码里有注释,http://download.csdn.net/detail/u013467495/8487407
  









这篇关于ExpandableListView的基本用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147654

相关文章

pytorch之torch.flatten()和torch.nn.Flatten()的用法

《pytorch之torch.flatten()和torch.nn.Flatten()的用法》:本文主要介绍pytorch之torch.flatten()和torch.nn.Flatten()的用... 目录torch.flatten()和torch.nn.Flatten()的用法下面举例说明总结torch

Python Faker库基本用法详解

《PythonFaker库基本用法详解》Faker是一个非常强大的库,适用于生成各种类型的伪随机数据,可以帮助开发者在测试、数据生成、或其他需要随机数据的场景中提高效率,本文给大家介绍PythonF... 目录安装基本用法主要功能示例代码语言和地区生成多条假数据自定义字段小结Faker 是一个 python

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和