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

来源:互联网 发布:java 通过ip获取地址 编辑:程序博客网 时间:2024/06/06 17:08

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

@Overrideprotected 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」。

1 0
原创粉丝点击