from 花葬_小吃一口
小白一位,本文仅一些自己在学习路上的一些总结,请各路大佬觉得不是,或有可补充的地方,请帮忙修正。学生感激不尽(耐心看完哦,代码有几百行,这是我对于可折叠列表学习所有的理解,希望可以帮助到有需要的人。请看本篇文章的伙伴,对于adapter有一定的理解)
可折叠列表
总有一些客户需求列表可以折叠。一开始能想到的就是定义一个type然后来区分哪一块来显示什么。这里要介绍一下ExpandListView的方便之处啦!!!
如果对可折叠列表有存在疑惑的伙伴可以参考一个QQ的好友列表。可折叠列表允许有父级标签,外加自己子级的内容。其实它就相当于两个listview的嵌套,说白了就是listview扩展来的。
添加内容
认识到可扩展列表后,我们很自然可以想到添加内容进去就需要父级集合和子级集合。
//首先我们需要定义两个存放数据的容器,一个用来存放父级内容,还有一个存放子级内容。这里的父级内容可以参考QQ好友列表的分组,子级内容可以参考分组里面的每一个好友。
private List<String> groupArray;//定义父级列表
private List<List<String>> itemArray;//定义子列表
private
认识BaseExpandableListAdapter
想要进行个性化定制页面,那我们就需要先来认识ExpandableListView的adapter 里面有哪些方法和属性。
@Override
public int getGroupCount() { //这个方法可以得到父级元素的数量
return groupArray.;
}
@Override
public int getChildrenCount(int groupPosition) { //这个方法可以得到子级元素的数量
return 0;
}
@Override
public Object getGroup(int groupPosition) { //这个方法得到第(groupPosition)个父级的内容
return groupArray.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) { //这个方法得到第(groupPosition)父级元素的第(childPosition)个的子级元素。
return itemArray.get(groupPosition).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) { //获取第(groupPostion)个组
return groupPostion;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition; //获取第(childPosition)个子级元素
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public 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;
}
@Override
public 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">
<TextView
android: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">
<ExpandableListView
android: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">
<ExpandableListView
android:id="@+id/elv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ExpandableListView>
</LinearLayout>