from 花葬_小吃一口
小白一位,本文仅一些自己在学习路上的一些总结,请各路大佬觉得不是,或有可补充的地方,请帮忙修正。学生感激不尽(耐心看完哦,代码有几百行,这是我对于可折叠列表学习所有的理解,希望可以帮助到有需要的人。请看本篇文章的伙伴,对于adapter有一定的理解)

可折叠列表
总有一些客户需求列表可以折叠。一开始能想到的就是定义一个type然后来区分哪一块来显示什么。这里要介绍一下ExpandListView的方便之处啦!!!
 如果对可折叠列表有存在疑惑的伙伴可以参考一个QQ的好友列表。可折叠列表允许有父级标签,外加自己子级的内容。其实它就相当于两个listview的嵌套,说白了就是listview扩展来的。
添加内容
认识到可扩展列表后,我们很自然可以想到添加内容进去就需要父级集合和子级集合。
//首先我们需要定义两个存放数据的容器,一个用来存放父级内容,还有一个存放子级内容。这里的父级内容可以参考QQ好友列表的分组,子级内容可以参考分组里面的每一个好友。
private List<String> groupArray;//定义父级列表private List<List<String>> itemArray;//定义子列表private 
 
认识BaseExpandableListAdapter
想要进行个性化定制页面,那我们就需要先来认识ExpandableListView的adapter 里面有哪些方法和属性。
  @Overridepublic int getGroupCount() {  //这个方法可以得到父级元素的数量return groupArray.;}@Overridepublic int getChildrenCount(int groupPosition) {  //这个方法可以得到子级元素的数量return 0;}@Overridepublic Object getGroup(int groupPosition) {   //这个方法得到第(groupPosition)个父级的内容return groupArray.get(groupPosition);}@Overridepublic Object getChild(int groupPosition, int childPosition) {  //这个方法得到第(groupPosition)父级元素的第(childPosition)个的子级元素。return itemArray.get(groupPosition).get(childPosition);}@Overridepublic long getGroupId(int groupPosition) {     //获取第(groupPostion)个组return groupPostion;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;					//获取第(childPosition)个子级元素}@Overridepublic boolean hasStableIds() {		return false;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {  //这个方法就和listview的getview一样,不过这里多了个group,所以这里是进行父级标签的初始化和赋值。GroupHolder groupHolder  = new GroupHolder();if(convertView == null) {convertView = inflater.inflate(R.layout.group_item,null);groupHolder.tvGroup = (TextView) convertView.findViewById(R.id.tvGroup);convertView.setTag(groupHolder);}else{groupHolder = (GroupHolder) convertView.getTag();}Data02 data = (Data02) groupArray.get(groupPosition);groupHolder.tvGroup.setText(data.group_tvgroup+"");return convertView;}@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {// 这个方法是进行子级标签的初始化和赋值。 ChildHolder childHolder = new ChildHolder();if (convertView == null){convertView = inflater.inflate(R.layout.child_item,null);childHolder.tvItem = (TextView) convertView.findViewById(R.id.tvItem);convertView.setTag(childHolder);}else {childHolder = (ChildHolder) convertView.getTag();}Data03 data = (Data03) itemArray.get(groupPosition).get(childPosition);childHolder.tvItem.setText(data.child_tvItem);return convertView;}@Override    //当选择子节点的时候被调用public boolean isChildSelectable(int groupPosition, int childPosition) {return false;}
 
这个控件属性基本已经介绍完毕了。
下面这个是我的两个数据类
	public class Data02 {public int group_tvgroup;}class Data03{public  String child_tvItem;}
 
下面这个是我的两个Holder类
class GroupHolder{   //存放父级元素的Holder类public TextView tvGroup;}class ChildHolder{   //存放子级元素的Holder类public TextView tvItem;}
}
 
下面的这个是group_item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/tvGroup"android:layout_width="200dp"android:layout_height="wrap_content"android:textSize="30dp"/></LinearLayout>
 
下面的这个是child_item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><ExpandableListViewandroid:id="@+id/elv"android:layout_width="wrap_content"android:layout_height="wrap_content"></ExpandableListView></LinearLayout>
 
下面的这个是expandablelist_item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><ExpandableListViewandroid:id="@+id/elv"android:layout_width="wrap_content"android:layout_height="wrap_content"></ExpandableListView></LinearLayout>











