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

相关文章

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

javascript fetch 用法讲解

《javascriptfetch用法讲解》fetch是一个现代化的JavaScriptAPI,用于发送网络请求并获取资源,它是浏览器提供的全局方法,可以替代传统的XMLHttpRequest,这篇... 目录1. 基本语法1.1 语法1.2 示例:简单 GET 请求2. Response 对象3. 配置请求