Android UI控件ExpandableListView基本用法详解
expandablelistview介绍
expandablelistview的引入
expandablelistview可以显示一个视图垂直滚动显示两级列表中的条目,这不同于列表视图(listview)。expandablelistview允许有两个层次:一级列表中有二级列表。
比如在手机设置中,对于分类,有很好的效果。手机版qq也是这样的效果。
使用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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。