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

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用