欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android UI控件ExpandableListView基本用法详解

程序员文章站 2024-03-06 08:18:31
expandablelistview介绍  expandablelistview的引入  expandablelistview可以显示一个视...

expandablelistview介绍 

expandablelistview的引入 

expandablelistview可以显示一个视图垂直滚动显示两级列表中的条目,这不同于列表视图(listview)。expandablelistview允许有两个层次:一级列表中有二级列表。
 比如在手机设置中,对于分类,有很好的效果。手机版qq也是这样的效果。

Android UI控件ExpandableListView基本用法详解 

使用expandablelistview的整体思路 

(1)给expandablelistview设置适配器,那么必须先设置数据源。

 (2)数据源,就是此处的适配器类expandableadapter,此方法继承了baseexpandablelistadapter,需要重写里面的10个方法。
 数据源中,用到了自定义的view布局,此时根据自己的需求,来设置组和子项的布局样式。
 getchildview()和getgroupview()方法设置自定义布局。 

(3)数据源设置好,直接给expandablelistview.setadapter()即可实现此收缩功能。 

expandablelistview的完整代码实现
 (1)activity_main.xml:在里面放置一个expandablelistview控件 

<?xml version="1.0" encoding="utf-8"?>
<relativelayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingbottom="@dimen/activity_vertical_margin"
 android:paddingleft="@dimen/activity_horizontal_margin"
 android:paddingright="@dimen/activity_horizontal_margin"
 android:paddingtop="@dimen/activity_vertical_margin"
 tools:context="com.smyhvae.expandablelistviewdemo.mainactivity">


 <expandablelistview
  android:id="@+id/expandablelistview"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  />

</relativelayout> 

(2)item_group.xml:一级列表的item的布局

<?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="wrap_content"
    android:background="#cccccc"
    android:orientation="horizontal">

 <textview
  android:id="@+id/tv_group"
  android:layout_width="wrap_content"
  android:layout_height="30dp"
  android:gravity="center"
  android:text="group text"
  android:textcolor="#000000"
  />

</linearlayout> 

(3)item_child.xml:二级列表的item的布局

 <?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="wrap_content"
    android:gravity="center"
    android:orientation="horizontal">

 <imageview
  android:id="@+id/iv_child"
  android:layout_width="30dp"
  android:layout_height="30dp"
  android:src="@mipmap/ic_launcher"/>

 <textview
  android:id="@+id/tv_child"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="item text"
  android:textcolor="#000000"/>

</linearlayout> 

(4)mainactivity.java: 

import android.app.activity;
import android.os.bundle;
import android.util.log;
import android.view.view;
import android.view.viewgroup;
import android.widget.baseexpandablelistadapter;
import android.widget.expandablelistview;
import android.widget.imageview;
import android.widget.textview;

public class mainactivity extends activity {

 //view
 private expandablelistview expandablelistview;

 //model:定义的数据
 private string[] groups = {"a", "b", "c"};

 //注意,字符数组不要写成{{"a1,a2,a3,a4"}, {"b1,b2,b3,b4,b5"}, {"c1,c2,c3,c4"}}
 private string[][] childs = {{"a1", "a2", "a3", "a4"}, {"a1", "a2", "a3", "b4"}, {"a1", "a2", "a3", "c4"}};


 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);
  expandablelistview = (expandablelistview) findviewbyid(r.id.expandablelistview);

  expandablelistview.setadapter(new myexpandablelistview());

 }


 //为expandablelistview自定义适配器
 class myexpandablelistview extends baseexpandablelistadapter {

  //返回一级列表的个数
  @override
  public int getgroupcount() {
   return groups.length;
  }

  //返回每个二级列表的个数
  @override
  public int getchildrencount(int groupposition) { //参数groupposition表示第几个一级列表
   log.d("smyhvae", "-->" + groupposition);
   return childs[groupposition].length;
  }

  //返回一级列表的单个item(返回的是对象)
  @override
  public object getgroup(int groupposition) {
   return groups[groupposition];
  }

  //返回二级列表中的单个item(返回的是对象)
  @override
  public object getchild(int groupposition, int childposition) {
   return childs[groupposition][childposition]; //不要误写成groups[groupposition][childposition]
  }

  @override
  public long getgroupid(int groupposition) {
   return groupposition;
  }

  @override
  public long getchildid(int groupposition, int childposition) {
   return childposition;
  }

  //每个item的id是否是固定?一般为true
  @override
  public boolean hasstableids() {
   return true;
  }

  //【重要】填充一级列表
  @override
  public view getgroupview(int groupposition, boolean isexpanded, view convertview, viewgroup parent) {

   if (convertview == null) {
    convertview = getlayoutinflater().inflate(r.layout.item_group, null);
   } else {

   }
   textview tv_group = (textview) convertview.findviewbyid(r.id.tv_group);
   tv_group.settext(groups[groupposition]);
   return convertview;
  }

  //【重要】填充二级列表
  @override
  public view getchildview(int groupposition, int childposition, boolean islastchild, view convertview, viewgroup parent) {

   if (convertview == null) {
    convertview = getlayoutinflater().inflate(r.layout.item_child, null);
   }

   imageview iv_child = (imageview) convertview.findviewbyid(r.id.iv_child);
   textview tv_child = (textview) convertview.findviewbyid(r.id.tv_child);

   //iv_child.setimageresource(resid);
   tv_child.settext(childs[groupposition][childposition]);

   return convertview;
  }

  //二级列表中的item是否能够被选中?可以改为true
  @override
  public boolean ischildselectable(int groupposition, int childposition) {
   return true;
  }
 }


} 

注:请自行完成convertview和viewholder的优化。 

工程文件:(android studio 2.1)http://xiazai.jb51.net/201609/yuanma/androidexpandablelistview(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。