合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
>由于之前发了篇「[BaseRecyclerAdapter之添加不同布局(头部尾部)](http://www.jianshu.com/p/9d75c22f0964)」收到了以下反馈,在此非常感谢,宝贵建议!希望加群多多提建议,让这个项目更加好用,帮助到更多人。 >>目前已优化:「[GitHub源码地址](https://github.com/CymChad/BaseRecyclerViewAdapterHelper)」 ![读者反馈](http://upload-images.jianshu.io/upload_images/972352-0bea9948c3a742b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #效果如何? 优化前: ``` 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](http://blog.csdn.net/cym492224103/article/details/51171802)」。