由于之前发了篇「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;
}
}
}
原理分析
由于上篇说了写多个不同类型的布局一定会用到getItemViewType
和onCreateViewHolder
方法,但是在优化后的代码中没看到,怎么做的到呢?
优化前: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」。
时间: 2024-10-24 14:44:28