美文网首页Android UIAndroid第三方扩展
BaseRecyclerAdapter之添加不同布局(头部尾部)

BaseRecyclerAdapter之添加不同布局(头部尾部)

作者: 陈宇明 | 来源:发表于2016-04-22 00:29 被阅读13447次

最近写了个Android开源库「BaseRecyclerViewAdapterHelper」集成了很多常见需求的解决方案,希望大家多多star哦~!

效果如何?

如何使用?

多个不同布局

public class MultipleItemAdapter extends BaseQuickAdapter<String> {
    private final int TEXT_TYPE = 1;
    private int mTextLayoutResId; 
   public MultipleItemAdapter(Context context, List data, int... layoutResId) {
        super(context, layoutResId[0], data);
        mTextLayoutResId = layoutResId[1];
    }
    @Override
    protected int getDefItemViewType(int position) {
        if (position % 2 == 0)
            return TEXT_TYPE;
        return super.getDefItemViewType(position);
   } 
   @Override
    protected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TEXT_TYPE)
            return new TextViewHolder(getItemView(mTextLayoutResId, parent));
        return super.onCreateDefViewHolder(parent, viewType);
    }
    @Override
    protected void onBindDefViewHolder(BaseViewHolder holder, String item) {
        if (holder instanceof TextViewHolder)
            holder.setText(R.id.tv, item); 
   }
    @Override
    protected void convert(BaseViewHolder helper, String item) {
        helper.setImageUrl(R.id.iv, item);
    }
    public class TextViewHolder extends BaseViewHolder {
        public TextViewHolder(View itemView) {
            super(itemView.getContext(), itemView);
        }
    }
}

添加头部尾部

mQuickAdapter.addHeaderView(getView());
mQuickAdapter.addFooterView(getView());

原理分析

如果需要定义多个不同类型的布局,需要知道以下几点:

  • 重写getItemViewType()方法,根据需求规则给出不同的type值。
  • 在onCreateViewHolder()方法里面根据不同的type来创建不同的ViewHolder
  • 在onBindViewHolder()里面根据不同holder的类型来赋予相对于的数据
  • 如果有额外布局(如:头部尾部)需要修改getItemCount()方法的返回数量

多个不同的布局的实现(三部曲)

1.重写了getDefItemViewType()方法,其实也就是父类的getItemViewType()里面的方法,如上所说,根据页面需求,做出规则,因为上面的UI是一个TextView一个ImageView交替的来,所以就写了个这样规则的 if (position % 2 == 0)保证他们交替着显示。
2.type搞定了,接下来就是调用onCreateDefViewHolder()了,根据上面的type来创建不同的ViewHolder,
3.然后再接下来调用onBindDefViewHolder(),根据上面创建的ViewHolder的类型不同来进行相应的赋值。

添加头部和尾部(额外布局)

在上面的基础之上再重写getItemCount()在原本数据量上加上根据额外布局的数量,代码如下

@Override

public int getItemCount() {

int i = mNextLoadEnable ? 1 : 0;

return mData.size() + i + getHeaderViewsCount() + getFooterViewsCount();

}

注意:如果是添加头部
那就必须在原onBindViewHolder()里面position-头部数量,因为不减去的话,那么数据就会从第二条开始遍历,所以要注意!

int index = position - getHeaderViewsCount();
convert(baseViewHolder, mData.get(index));

意外收获

国际友人的加盟

每次收获一点点,后续还会扩展更多功能,供大家使用及学习「BaseRecyclerViewAdapterHelper」。

相关文章

网友评论

  • 245b48a6ccc0:大神,有个问题,请教你一下,就是addFooterView(view)出现数据不足情况下,加载布局显示在数据后面,影响数据(并不在底部),怎么把FooterView放在布局的底部,就是数据只有一条的时候,也要放在最低部
    24b755b3e48e:我遇到了和你一样的问题,希望你有了好的解决方案
  • 街道shu记:宇明哥,GridLayoutManager的时候,添加footView的时候,怎么使footView紧跟后面啊?类似朋友圈选择照片,后面一直有一个加号的图片
  • _Youngjim:这个头部能刷新数据吗
  • 2e40adfe9a54:使用Gird布局管理器加上多布局话 添加头部,设置完SpanSize后,布局顺序是乱的,能解决吗?
  • 徐敏敏:添加头部,设置decoration会有问题
    陈宇明:头部本质上就是item
  • 549c0e6ffcff:您好, 请问咱这个框架支持上拉刷新,提示"正在加载", 并且当加载完最后一条时提示"无更多数据"吗?
    还有当数据不满一屏时, 在加载完数据后也提示"无更多数据"?
    谢谢
    陈宇明:@徐敏敏 可以设置成一个item的效果,具体可以看文档
    徐敏敏:@陈宇明 gridlayoutmanager加头是独占一行,而不是加一个item的效果?
    陈宇明:可以实现
  • da5f9afd4272:请问一下, 仿微信通讯录 按字母排序,这个框架可以实现吗
    陈宇明:这个框架不提供这个功能。
  • a6c4d35ea1e3:东西很好,但是题主有个毛病,很多代码通篇没有注释,有些东西看不明白
  • 4587992705f7:你好,请问添加完头部视图后,怎么实现头部视图子控件的点击事件呢?
    陈宇明:@Mr宋龙 先设置点击事件,在设置add。demo有代码
  • 我姓连:grid 样式的时候 添加头部 有问题的
    陈宇明: @请不要阻止我的变态 更新最新版本,问题解决了
  • 759473b786dd:博主你好,急:请问一下
    添加头部的时候出现IndexOutOfBoundsException ,
    原因是BaseMultiItemQuickAdapter.getDefItemViewType这个里面的position没有加入头部的数量,
    重写这个方法后 发现整个recycleview 的最后的item不能完全描绘出来
    想请问一下应该如何正确添加头部 谢谢了
    759473b786dd:@陈宇明 看见了
    759473b786dd:@陈宇明 群号是?
    陈宇明:@759473b786dd 加群
  • 4d7d8eba04d2:楼主,你的demo在点击Section的标题的时候,会报空指针
    陈宇明:@4d7d8eba04d2 多谢提醒,已修复,代码已上传!
  • 4d7d8eba04d2:亲,这个添加头部或者尾部最多只有一个头部或者尾部吧,能做到支持多header及多footer吗
    陈宇明:@binwin20 https://github.com/CymChad/BaseRecyclerViewAdapterHelper/issues/77 在这里提出你的需求,如何需求合理,我会安排来做的。
    binwin20:@陈宇明 现在有打算支持多个 Header 和多个Footer 吗?
    陈宇明:@4d7d8eba04d2 目前不支持,如果有需求的话可以做。
  • Wish_xy:我在想,可不可以把多布局也优化一下?不需要写这么多的代码,只需要暴露出一个添加多布局的方法就好了呢?
    陈宇明:你的建议,已被采纳并已修复,详细可查看 https://github.com/CymChad/BaseRecyclerViewAdapterHelper
    陈宇明:@wish_xy 加群我们详细聊聊。
    陈宇明:@wish_xy 想法非常好!我尝试一下。

本文标题:BaseRecyclerAdapter之添加不同布局(头部尾部)

本文链接:https://www.haomeiwen.com/subject/yqvzlttx.html