RecyclerView多类型item的简单实现

  • RecyclerView在项目中使用大家比较简单,但当页面中item类型超过三个以上(比如绚丽的首页等),通过不同的类型去选择不同的viewHolder会导致adapter中的代码过于复杂,后期增加或删减item更加痛苦。本文将采用另一种方式来应对复杂多变的item。
详细类图参考.png

使用方式:

1.所有itemBean统一实现Visitable接口中的type方法

/**
 * Created by beifeng on 2017/2/17.
 * 所有itembean统一实现的接口
 */
public interface Visitable {
    int type(TypeFactory typeFactory);
}

itemBean中通过typeFactory返回对应的type区分

/**
 * Created by beifeng on 2017/2/17.
 * 头部bean
 */

public class BannerBean implements Visitable {
  String url;

  public String getUrl() {
    return url;
  }

  public void setUrl(String url) {
    this.url = url;
  }

  public BannerBean(String url) {
    this.url = url;
  }



  /**
   * 工厂类返回对应itembean的类型
   */
  @Override public int type(TypeFactory typeFactory) {
    return typeFactory.type(this);
  }
}

2. 简单的工厂模式,通过不同类型bean返回不同类型的holder

/**
 * Created by beifeng on 2017/2/17.
 * type 工厂类 用来返回不同的itmetpe
 */
public interface TypeFactory {
  //  定义所有的返回类型
  int type(BannerBean bannerBean);
  int type(ContentBean contentBean);
  BaseViewHolder createViewHolder(int type, View itemView);
}

具体实现类ItemTypeFactory

通过将不同item的layoutID作为type返回对应item的viewholder,这种做法的好处是 在adapter的 onCreateViewHolder(ViewGroup parent, int viewType)中通过viewtype直接获取view,进而获取相应的viewHoler,大大减轻了adapter中的复杂的类型判断。

/**
 * Created by beifeng on 2017/2/17.
 * 实现type工程类
 */

public class ItemTypeFactory TypeFactory {
  public static final int BANNER_ITEM_LAYOUT = R.layout.item_banner_mulittype;//  测试布局1
  public static final int CONTENT_ITEM_LAYOUT = R.layout.item_content_mulittype;//  测试布局2
  @Override public int type(BannerBean bannerBean) {
    return BANNER_ITEM_LAYOUT;
  }

  @Override public int type(ContentBean contentBean) {
    return CONTENT_ITEM_LAYOUT;
  }

  @Override public BaseViewHolder createViewHolder(int type, View itemView) {
    switch (type) {
      case BANNER_ITEM_LAYOUT:
        return new BannerViewHolder(itemView);
      case CONTENT_ITEM_LAYOUT:
        return new ContentViewHolder(itemView);
      default:
        return null;
    }
  }
}

3.此时可以在recycleView的Adpter中愉快的玩耍啦

/**
 * Created by beifeng on 2017/2/17.
 */

public class MulitAdpter extends RecyclerView.Adapter<BaseViewHolder> {
  private ItemTypeFactory typeFactory;
  List<Visitable> mItems;
  /**
   * 构造函数
   */
  public MulitAdpter(List<Visitable> mData) {
    //  item工厂类 生产viewholder
    this.typeFactory = new ItemTypeFactory();
    mItems=mData;
  }

  @Override public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent,false);
    return typeFactory.createViewHolder(viewType, view);//划重点

  }

  @Override public void onBindViewHolder(BaseViewHolder holder, int position) {
    holder.bindViewData(mItems.get(position));
  }

  @Override public int getItemViewType(int position) {
    return mItems.get(position).type(typeFactory);  //划重点
  }

  @Override public int getItemCount() {
    return (mItems != null ? mItems.size() : 0);
  }
}

4.总结

此时可以在recycleView的Adpter中愉快的玩耍啦,面对更复杂的recycleView页面轻松应对。这种方式虽然类结构较复杂,但将复杂的多类型item与adapter解耦,便于维护。后期需要新增个类型,完全可以不用修改adapter,只需要增加对应的bean,viewHolder即可。
Demo链接

实现思路

Jan M and Dmitri Kudrenko on Github
https://github.com/meierjan/BetterAdapters

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容