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

Android ExpandableRecyclerView使用方法详解

程序员文章站 2023-11-20 19:06:46
 本文为大家分享了android expandablerecyclerview的使用,供大家参考,具体内容如下 1.目前只支持两级结构。 2.支持所有组同时...

 本文为大家分享了android expandablerecyclerview的使用,供大家参考,具体内容如下

1.目前只支持两级结构。
2.支持所有组同时全部展开,支持同一时间只能展开一组。
3.groupview,childview高度自定义。
4.支持初始化数据时,指定展开某组数据。
5.支持groupitem,childitem的onlick,onlongclick事件。
6.展开收起带动画。

效果图:

Android ExpandableRecyclerView使用方法详解

使用步骤:加入依赖

compile 'com.drawthink:expandable-recyclerview:0.0.3'

1.继承baseviewholder,实现自己的viewholder

1.1 在构造函数中初始化你的view(包括groupview,和childview).

1.2 分别实现以下两个方法,并在对应方法中返回对应layout布局文件中根节点的id。

public int getgroupviewresid()

public int getchildviewresid()

示例代码:

public class imageviewholder extends baseviewholder {

  public imageview image;
  public textview tvtitle;

  /**
   * 初始化你的view(这里包括groupview,和childview)
   */
  public imageviewholder(context ctx, view itemview, int viewtype) {
    super(ctx,itemview, viewtype);
    image = (imageview) itemview.findviewbyid(r.id.iv_image);
    tvtitle = (textview)itemview.findviewbyid(r.id.tv_title);
  }

  /**
   * @return 返回你的groupview 布局文件中根节点的id
   */
  @override
  public int getgroupviewresid() {
    return r.id.group;
  }

  /**
   * @return 返回你的childview 布局文件中根节点的id
   */
  @override
  public int getchildviewresid() {
    return r.id.child;
  }

}

2.继承baserecyclerviewadapter
/**
 * author:drawthink
 * describe:
 * date: 2017/5/22
 * t :group data
 * s :child data
 * vh :viewholder
 */

public abstract class baserecyclerviewadapter<t,s,vh extends baseviewholder> extends recyclerview.adapter<vh>

示例adapter代码:

public class imageadapter extends baserecyclerviewadapter<string,imagebean,imageviewholder> {

  private context ctx;
  private list datas;
  private layoutinflater minflater;

  public imageadapter(context ctx, list<recyclerviewdata> datas) {
    super(ctx, datas);
    minflater = layoutinflater.from(ctx);
    this.ctx = ctx;
    this.datas = datas;
  }

  @override
  public void onbindgroupholder(imageviewholder holder, int grouppos,int position, string groupdata) {
    holder.tvtitle.settext(groupdata);
  }

  @override
  public void onbindchildpholder(imageviewholder holder, int grouppos,int childpos,int position, imagebean childdata) {
    holder.image.setbackgroundresource(childdata.getresid());
  }

  @override
  public view getgroupview(viewgroup parent) {
    return minflater.inflate(r.layout.title_item_layout,parent,false);
  }

  @override
  public view getchildview(viewgroup parent) {
    return minflater.inflate(r.layout.item_image_layout,parent,false);
  }

  @override
  public imageviewholder createrealviewholder(context ctx, view view, int viewtype) {
    return new imageviewholder(ctx,view,viewtype);
  }
}

完成以上两步之后,基本大工告成,由于expandablerecyclerview的数据是要分组的,所以提供了recyclerviewdata来封装

/**
   * @param groupdata
   * @param childdatas
   * @param isexpand  初始化展示数据时,该组数据是否展开
   */
public recyclerviewdata(t groupdata, list<s> childdatas,boolean isexpand)

那接下来看下数据具体是怎样封装的。

    mdatas = new arraylist<>();
    list<imagebean> bean1 = new arraylist<>();
    list<imagebean> bean2 = new arraylist<>();
    list<imagebean> bean3 = new arraylist<>();
    // 每个子列表长度可以不相同
    bean1.add(new imagebean("dog", r.mipmap.dog));
    bean1.add(new imagebean("dog", r.mipmap.dog));
    bean2.add(new imagebean("cat", r.mipmap.cat));
    bean3.add(new imagebean("bird", r.mipmap.bird));

    mdatas.add(new recyclerviewdata("dog", bean1, true));
    mdatas.add(new recyclerviewdata("cat", bean2, true));
    mdatas.add(new recyclerviewdata("bird", bean3, true));

所有工作以完成,现在你可以象平常使用adapter,recyclerview一样,来愉快的写代码了。

注意:在对元数据mdatas进行增删操作时,要调用adapter.notifyrecyclerviewdata();否则会造成数据索引错乱的问题。

代码github地址

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