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

相关文章

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

UVM:callback机制的意义和用法

1. 作用         Callback机制在UVM验证平台,最大用处就是为了提高验证平台的可重用性。在不创建复杂的OOP层次结构前提下,针对组件中的某些行为,在其之前后之后,内置一些函数,增加或者修改UVM组件的操作,增加新的功能,从而实现一个环境多个用例。此外还可以通过Callback机制构建异常的测试用例。 2. 使用步骤         (1)在UVM组件中内嵌callback函

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

这些ES6用法你都会吗?

一 关于取值 取值在程序中非常常见,比如从对象obj中取值 const obj = {a:1b:2c:3d:4} 吐槽: const a = obj.a;const b = obj.b;const c = obj.c;//或者const f = obj.a + obj.b;const g = obj.c + obj.d; 改进:用ES6解构赋值

Gradle的基本使用

新建一个项目后,在项目文件夹下创建build.gradle文件,并加入内容:       apply plugin: 'eclipse'。    然后在终端运行gradle eclipse即可构建eclipse IDE的开发环境。    gradle默认值:gradle有些目录是有默认值存在,建议项目的配置,承袭了maven的风格,如:         java的源码目录:src/mai