换种思路解决列表套列表-ExpandableListView的使用

效果

这里写图片描述

注:ExpandableListView 二级列表(树形) ,此需求中可以把上面固定部分当成一级列表(大标题),人员可以当成2级(一个大标题对应多个小标题),此思路适合用于上面为固定部分,最下面为不固定部分(即列表),如果不固定部分在中间,可能就不适用此种思路。

ExpandableListView的使用

1.数据结构

这里写图片描述

2.Adapter extends BaseExpandableListAdapter

private List<Map<String,Object>> group = new ArrayList<>();
private Context mContext;

public ExpandableAdapter(List<Map<String, Object>> group, Context mContext) {
    this.group = group;
    this.mContext = mContext;
}
// 获取组元素数目
@Override
public int getGroupCount() {
    return group.size();
}

// 获取子元素数目
@Override
public int getChildrenCount(int groupPosition) {

    // 取出组中的groupPosition位置的数据
    Map<String, Object> map = group.get(groupPosition);
    // 取出子元素集合
    List<Map<String,Object>> child = (List<Map<String, Object>>) map.get("ry");

    return child.size();
}
// 获取组元素对象
@Override
public Object getGroup(int groupPosition) {
    return group.get(groupPosition);
}

// 获取子元素对象
@Override
public Object getChild(int groupPosition, int childPosition) {

    // 取出组中的groupPosition位置的数据
    Map<String, Object> map = group.get(groupPosition);
    // 取出子元素集合
    List<Map<String,Object>> child = (List<Map<String, Object>>) map.get("ry");

    return child.get(childPosition);
}
// 获取组元素Id
@Override
public long getGroupId(int groupPosition) {
    return groupPosition;
}

// 获取子元素Id
@Override
public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}
// 加载并显示组元素 
@Override
public View getGroupView(int i, boolean b, View convertView, ViewGroup parent) {

    final Map<String, Object> data = group.get(i);

    GroupViewHolder groupViewHolder;
    if (convertView == null) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.group_item, parent, false);
        groupViewHolder = new GroupViewHolder();
        groupViewHolder.create_time = (TextView) convertView.findViewById(R.id.create_time);
        convertView.setTag(groupViewHolder);
    } else {
        groupViewHolder = (GroupViewHolder) convertView.getTag();
    }

    groupViewHolder.create_time.setText((String) data.get("titleRq"));

    return convertView;

}
// 获取显示指定分组中的指定子选项的视图
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

    // 取出组中的groupPosition位置的数据
    Map<String, Object> map = group.get(groupPosition);
    // 取出子元素集合
    List<Map<String,Object>> child = (List<Map<String, Object>>) map.get("ry");

    final Map<String, Object> data = child.get(childPosition);

    final ChildViewHolder childViewHolder;

    if (convertView == null) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.child_item, parent, false);
        childViewHolder = new ChildViewHolder();
        childViewHolder.ry_name = (TextView) convertView.findViewById(R.id.name);
        childViewHolder.ry_agree = (TextView) convertView.findViewById(R.id.agree);

        convertView.setTag(childViewHolder);
    } else {
        childViewHolder = (ChildViewHolder) convertView.getTag();
    }

    childViewHolder.ry_name.setText((String) data.get("name"));
    childViewHolder.ry_agree.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // ...
        }
    });

    return convertView;
}
// 分组和子选项是否持有稳定的ID, 就是说底层数据的改变会不会影响到它们
@Override
public boolean hasStableIds() {
    return true;
}

// 用来判断某Group某个child是否可选
@Override
public boolean isChildSelectable(int i, int i1) {
    return true;
}
    static  class GroupViewHolder{
        TextView create_time;
    }

    static class ChildViewHolder{
        TextView ry_name;
        TextView ry_agree;
    }

3.布局

<!--groupIndicator 箭头-->
<!--divider 组元素的分割线-->
<!--childDivider 子元素的分割线-->
<ExpandableListView
    android:id="@+id/ev"
    android:layout_width="match_parent"
    android:divider="#ffffffff"
    android:childDivider="#ffffffff"
    android:groupIndicator="@null"
    android:layout_height="match_parent"/>

4.代码

adapter = new ExpandableAdapter(data,this);
ev.setAdapter(adapter);

// 默认展开子元素
for (int i=0; i<data.size(); i++) {
    ev.expandGroup(i);
}

// 设置点击组元素不会收起子元素
ev.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
    @Override
    public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {

        //设置点击不关闭(不收回)
        view.setClickable(true);
        return true;
    }
});

源码下载(上拉加载更多、点击按钮动态改变数据源并展示最新数据)点我下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用ExpandableListView可以实现QQ好友分组列表。首先需要创建一个ExpandableListView控件,并为其设置适配器。适配器需要继承BaseExpandableListAdapter,并实现以下方法: 1. getGroupCount():获取分组的数量。 2. getChildrenCount():获取某个分组下子项的数量。 3. getGroup():获取某个分组的数据。 4. getChild():获取某个分组下某个子项的数据。 5. getGroupId():获取某个分组的ID。 6. getChildId():获取某个分组下某个子项的ID。 7. hasStableIds():判断分组和子项的ID是否稳定。 8. getGroupView():获取分组的视图。 9. getChildView():获取子项的视图。 10. isChildSelectable():判断子项是否可选中。 在实现适配器的过程中,需要根据数据源的结构来设置分组和子项的数据。例如,可以使用一个List<List<String>>来存储分组和子项的数据,其中外层List表示分组,内层List表示子项。在getGroup()和getChild()方法中,需要根据groupPosition和childPosition来获取对应的数据。 最后,需要为ExpandableListView设置分组的展开和收起事件。可以通过设置OnGroupClickListener和OnChildClickListener来实现。在OnGroupClickListener中,需要根据groupPosition来判断当前分组是否已经展开,如果已经展开则返回false,否则返回true。在OnChildClickListener中,可以根据childPosition来获取对应的数据,并进行相应的操作。 通过以上步骤,就可以实现一个简单的QQ好友分组列表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值