美文网首页Android-RecyclerViewAndroid开发者俱乐部RecyclerView
BaseRecyclerAdapter之添加不同布局(优化篇)

BaseRecyclerAdapter之添加不同布局(优化篇)

作者: 陈宇明 | 来源:发表于2016-04-22 18:31 被阅读16730次

    由于之前发了篇「BaseRecyclerAdapter之添加不同布局(头部尾部)」收到了以下反馈,在此非常感谢,宝贵建议!希望加群多多提建议,让这个项目更加好用,帮助到更多人。

    目前已优化:「GitHub源码地址

    读者反馈

    效果如何?

    优化前:

    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);
            }
        }
    }
    

    优化后(瘦身二分之一):

    public class MultipleItemQuickAdapter extends BaseMultiItemQuickAdapter<MultipleItem> {
        public MultipleItemQuickAdapter(Context context, List data) {
            super(context, data);
            addItmeType(MultipleItem.TEXT, R.layout.text_view);
            addItmeType(MultipleItem.IMG, R.layout.image_view);
        }
        @Override
        protected void convert(BaseViewHolder helper, MultipleItem item) {
            switch (helper.getItemViewType()) {
                case MultipleItem.TEXT:
                    helper.setImageUrl(R.id.tv, item.getContent());
                    break;
                case MultipleItem.IMG:
                    helper.setImageUrl(R.id.iv, item.getContent());
                    break;
            }
        }
    }
    

    原理分析

    由于上篇说了写多个不同类型的布局一定会用到getItemViewTypeonCreateViewHolder方法,但是在优化后的代码中没看到,怎么做的到呢?
    优化前:getDefItemViewType

    protected int getDefItemViewType(int position) {
             if (position % 2 == 0) return TEXT_TYPE; 
             return super.getDefItemViewType(position);
     }
    

    优化后不用写:getDefItemViewType,看看基类的处理

    @Overrideprotected int getDefItemViewType(int position) {
        return mData.get(position).getItemType();
    }
    

    原理分析:在填充数据的时候就把view type给添加进去了。


    优化前:onCreateDefViewHolder

    @Override
    protected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TEXT_TYPE)
            return new TextViewHolder(getItemView(mTextLayoutResId, parent));
            return super.onCreateDefViewHolder(parent, viewType);
    }
    

    优化后不用写:onCreateDefViewHolder,看看基类的处理

    private SparseArray<Integer> layouts;
    protected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) {
        int layoutId = getLayoutId(viewType);
        View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
        return new BaseViewHolder(mContext, view);
    }
    private int getLayoutId(int viewType) { return layouts.get(viewType);}
    protected void addItmeType(int type, int layoutResId) {
        if (layouts == null) {
            layouts = new SparseArray<>();
        }
        layouts.put(type, layoutResId);
    }
    

    原理分析:addItmeType以type为键以layoutResId为值存储到的SparseArray里面,在onCreateDefViewHolder根据viewType来获取相应的layoutResId。

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

    相关文章

      网友评论

      • 一个有故事的程序员:请问一下,findviewbyid不写的话,怎么赋值呢?
      • 778d07037554:刷新数据越刷越多,如何adapter里面的集合清空掉
      • Haygor:现在的多布局貌似实现不了自定义的viewholder啊
        Haygor:@亚瑟的大宝剑 确实硬伤 以往实现单独的ViewHolder可以进行一些控件的初始化设定,例如为TextView绑定TextWatcher,为RecyclerView绑定Adapter,现在只能傻傻的在covert里自行判定,非常蛋疼
        156ab6b0261b:原生Adapter是支持的,这个扩展后竟然不支持?还是我没找到方法?请各位大神告知,感谢~
        156ab6b0261b:我也发现这问题了,硬伤啊,不同类型item要用不同的viewholder,结果好像不支持。。。
      • duyi324:大神你好,请问一下多条目的布局如何添加拖拽效果?
      • 一颗心为你安分守己_0f8c:大佬,添加头布局为横向滑动的RecycleView上下滑动不流畅,如何处理?
      • dcb52d749433:你好,最近我在使用过程中遇到一个新问题,在使用多布局的时候,其中我有一个布局是带有百度地图的,我想在Activity中使用这个控件,但是没办法获取这个控件的id,请问有什么方法么?也就是说在adapter添加的布局,但需要在Activity中使用布局中的一个控件;目前里面仅有子控件的点击事件;
      • 老师好我是小明同学:大神你好,多布局无法完全清空怎么办
        class Header extends AbstractExpandableItem<Data> implements MultiItemEntity
        class Data implements MultiItemEntity
        Header对应的布局无法清空,请问怎样解决?
        老师好我是小明同学:@陈宇明 不可以再优化了吗?。。
        老师好我是小明同学:@陈宇明 这虽然是一种解决方法,但是我原本的adapter有footer什么的,也要重新设置,reclyclerView要再setAdapter的话,这岂不是违背了刷新的意义?
        陈宇明:new adapter
      • 0d8eae2b5a1f:那么 一个recyclerview里面再嵌套一个多布局的recyclerview的情况呢?
        幻幻90:@陈宇明 怎么使用啊,例子里没看到有啊
        陈宇明:都是支持的
      • e0dcbdff6a82:真心挺好用的这个
      • b973150428c2:GridLayoutManager如何添加头布局
      • d6dd94e91b30:你好 我现在recyclerview要添加头和尾 而且中间的item是不同类型的并且需要长按拖拽 如果用你的adapter的话 需要实现长按拖拽的话需要继承BaseItemDraggableAdapter 而这个adapter是不能添加不同的item的 这个要怎么弄 大神
        陈宇明:@Cancri兮 移植代码
      • 刘泽旻:你这个完全不行啊 值都赋不进去的
        陈宇明: @刘泽旻 github有源码,你可以看一下
      • e7fa46c17820:如果activity中里使用这个多布局的Adapter,要想实现上拉加载就是在还是在Activity里实现BaseQuickAdapter.RequestLoadMoreListener接口就行么??
        陈宇明:恩 是的
      • 付凯强:您好,项目需要估计一个小时才能加载完毕啊,怎么回事啊,我都醉了。
        陈宇明:@剑走偏锋雨 网络问题
      • 1fe8a580f69f:請問為什麼要在 adapter 裡面傳入 pageSize 呢?
        因為看原碼 isLoadMore 裡面,
        判斷 mData.size() >= pageSize 感覺不用傳入也可判斷是否需要 loadMore
        懇請大大解惑 :pray:
        罗泽宇:请问怎么处理那个分组多类型的数据 假如我有三组不同的类型 每组数据都有一个header ,这个只是处理了多类型的问题 多类型里面可不可以定制不同的布局
        1『------------------header
        2,3,4--类型一

        5『------------------header
        6,7,8--类型二

        9『------------------header
        10,11,12,13--类型三
        陈宇明:@JasonNi pageSize是一页显示多少条数据的意思。
      • 641eef31c0a9:当正在加载更多时候,向上滑后在加载更多还没有结束的时候再滑到底部就报IndexOutOfBoundsException了
        陈宇明:@上_杉_ 最新版本bug已经修复
      • thisfeng:由衷的钦佩 👏

      本文标题:BaseRecyclerAdapter之添加不同布局(优化篇)

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