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

由于之前发了篇「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」。

推荐阅读更多精彩内容