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

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

oracle中exists和not exists用法举例详解

《oracle中exists和notexists用法举例详解》:本文主要介绍oracle中exists和notexists用法的相关资料,EXISTS用于检测子查询是否返回任何行,而NOTE... 目录基本概念:举例语法pub_name总结 exists (sql 返回结果集为真)not exists (s

Springboot中Jackson用法详解

《Springboot中Jackson用法详解》Springboot自带默认json解析Jackson,可以在不引入其他json解析包情况下,解析json字段,下面我们就来聊聊Springboot中J... 目录前言Jackson用法将对象解析为json字符串将json解析为对象将json文件转换为json