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

ExpandableListView实现手风琴效果

程序员文章站 2023-12-04 10:16:16
本文实例为大家分享了expandablelistview实现手风琴效果的具体代码,供大家参考,具体内容如下 1. 效果示例图 2. 创建方法 (1)第...

本文实例为大家分享了expandablelistview实现手风琴效果的具体代码,供大家参考,具体内容如下

1. 效果示例图

ExpandableListView实现手风琴效果

ExpandableListView实现手风琴效果

ExpandableListView实现手风琴效果

2. 创建方法

(1)第一种方法与listview等普通控件一样,直接在布局文件中添加expandablelistview控件即可。

(2)第二种方法则是创建一个activity继承自expandablelistactivity,而后通过getexpandablelistview()方法可获得一个expandablelistview对象。

第二种方法仅适用于一个页面中只有一个expandablelistview的情况。继承的activity不需要再调用setcontentview()方法,在expandablelistactivity中已经关联了一个系统定义的布局文件。

3. 部分属性和点击事件

android:groupindicator、android:childindicator:组条目和子条目前面的图标,默认值为箭头,可设置自定义图片资源。若不显示该图标,则设置为@null。

android:divider、android:childdivider:组和子条目的分隔线。

expandablelistview的点击事件有两个,分别对应组和子条目的点击事件:

设置组的点击事件:setongroupclicklistener(ongroupclicklistener listener)

设置子条目的点击事件:setonchildclicklistener(onchildclicklistener listener)

5. 适配器

根据数据源的不同,可使用的适配器有两个:baseexpandablelistadapter和cursortreeadapter,其中,cursortreeadapter用于数据源为cursor对象的情况下,其它情况则使用baseexpandablelistadapter。

(1)baseexpandablelistadapter需要重写的方法:

getgroup():从数据源中获取组的数据内容。

getgroupcount():获取组的总数。

getgroupid():获取组的id。

getgroupview():获取组的视图。

getchild():从数据源中获取子条目的内容。

getchildcount():获取指定组中的子条目总数,并非全部的子条目。

getchildid():获取子条目的id。

getchildview():获取子条目的视图

hasstableids():判断id对应的条目是否已经绘制,用于优化列表。

ischildselectable():子条目是否允许点击,若返回false,则子条目点击事件无效。

(2)cursortreeadapter需要重写的方法:

cursortreeadapter():构造方法传入组的cursor对象。

getchildrencursor():传入组的cursor对象,获取相应的组的子条目的cursor对象。

newgroupview():创建组的视图,返回一个新的视图。

bindgroupview():在这里绑定组视图的数据内容,第一个参数即newgroupview()方法的返回值。

newchildview():创建子条目的视图。

bindchildview():绑定子条目视图的数据内容。

6. 简单范例

实现效果图中的例子。

布局:

<?xml version="1.0" encoding="utf-8"?>
<linearlayout 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"
  tools:context="com.studying.expandablelistviewdemo.mainactivity">

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

</linearlayout>

activity:

public class mainactivity extends activity {

  private expandablelistview elv;

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

    elv = (expandablelistview) findviewbyid(r.id.elv_local_data);
    mybaseexpandablelistadapter adapter = new mybaseexpandablelistadapter(this, loaddata.getgroupdata(), loaddata.getchilddata());
    elv.setadapter(adapter);
  }
}

加载测试数据用的工具类:

public class loaddata {

  // 组的数据内容
  public static list<string> getgroupdata() {
    list<string> groupdatalist = new arraylist<>();
    groupdatalist.add("计算机基础");
    groupdatalist.add("安卓开发");
    return groupdatalist;
  }

  // 子条目的数据内容
  public static list<list<string>> getchilddata() {
    list<list<string>> childdatalist = new arraylist<>();

    list<string> group1 = new arraylist<>();
    group1.add("数据结构");
    group1.add("算法");
    group1.add("计算机网络");
    childdatalist.add(group1);

    list<string> group2 = new arraylist<>();
    group2.add("控件使用");
    group2.add("网络操作");
    group2.add("数据存储");
    group2.add("四大组件");
    childdatalist.add(group2);

    return childdatalist;
  }
}

适配器:

public class mybaseexpandablelistadapter extends baseexpandablelistadapter {

  private context mcontext;

  private list<string> groupname;
  private list<list<string>> childname;

  public mybaseexpandablelistadapter(context mcontext, list<string> groupname, list<list<string>> childname) {
    this.mcontext = mcontext;
    this.groupname = groupname;
    this.childname = childname;
  }

  @override
  public int getgroupcount() {
    return groupname.size();
  }

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

  @override
  public string getgroup(int groupposition) {
    return groupname.get(groupposition);
  }

  @override
  public view getgroupview(int groupposition, boolean isexpanded, view convertview, viewgroup parent) {
  
    convertview = view.inflate(mcontext, r.layout.item_group_name, null);

    textview groupname = (textview) convertview.findviewbyid(r.id.group_name);
    groupname.settext(getgroup(groupposition));

    return convertview;
  }

  @override
  public int getchildrencount(int groupposition) {
    return childname.get(groupposition).size();
  }

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

  @override
  public string getchild(int groupposition, int childposition) {
    return childname.get(groupposition).get(childposition);
  }

  @override
  public view getchildview(int groupposition, int childposition, boolean islastchild, view convertview, viewgroup parent) {
  
    convertview = view.inflate(mcontext, r.layout.item_child_name, null);

    textview childname = (textview) convertview.findviewbyid(r.id.child_name);
    childname.settext(getchild(groupposition, childposition));

    return convertview;
  }

  @override
  public boolean hasstableids() {
    return false;
  }

  @override
  public boolean ischildselectable(int groupposition, int childposition) {
    return true;
  }
}

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