这里是和别人的万能Adapter最为不同的一点了,解耦JavaBean!(最好可以在阅读前一篇文章http://blog.csdn.net/qq_36523667/article/details/78976767的基础上阅读本文)
何为解耦JavaBean?
你平时使用的是不是JavaBean?在你看过这个系列第一篇文章后,那个泛型就是JavaBean。我们传入的参数类型,将不再是JavaBean了。我们原来传入的是List<JavaBean>,比如现在JavaBean由一个String和一个Bitmap组成,那么我们传入的数据就是List<String>和List<Bitmap>了。
为什么要解耦JavaBean?
因为JavaBean就是一种耦合。防改需求。一旦客户需求变了,JavaBean也要变,那么JavaBean一改处处都要改。而你如果解耦了JavaBean,你只需要增加一个集合就可以了,其他没有任何地方需要改。这里不是说JavaBean不好,而是我们不应该专门为RecyclerView创建一个JavaBean。况且RecyclerView中的JavaBean和我们业务需要的JavaBean数据类型统一起来十分麻烦。综上所述,RecyclerView中的JavaBean是非解耦不可。
怎么解耦JavaBean?
最大的问题就是在于怎么支持多参数。一个JavaBean有很多个参数,我们应该怎么处理呢?所以如果我们要支持9个参数类型的话,就要写9个方法,别嫌麻烦,重用性是极高的。
下面是我们支持两个参数的Adapter,其实和我们上篇文章的Adapter没有太大区别
public abstract class TestAdapter<A,B> extends RecyclerView.Adapter<CommonViewHolder>{ private final Context context; private final LayoutInflater inflater; private final int layoutId; private final List<A> aList; private final List<B> bList; public TestAdapter(Context context, int layoutId, List<A> aList, List<B> bList) { this.context = context; this.inflater = LayoutInflater.from(context); this.layoutId = layoutId; this.aList = aList; this.bList = bList; } @Override public CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new CommonViewHolder(inflater.inflate(layoutId, parent, false)); } @Override public void onBindViewHolder(CommonViewHolder holder, int position) { convert(holder, position, aList.get(position), bList.get(position)); } protected abstract void convert(CommonViewHolder holder, int position, A a, B b); @Override public int getItemCount() { return aList.size(); } }所以接下来只能重复弄9个一样的方法,分别支持9个泛型参数。(当然你也可以一次写A,B,C,D,E,F,G,H,I9个参数,另外的不赋值就可以)
最后看一下,我们的成功解耦JavaBean的使用代码
TestAdapter<String, Bitmap> adapter = new TestAdapter<String, Bitmap>(this, R.layout.item1, stringList, bitmapList) { @Override protected void convert(CommonViewHolder holder, int position, String s, Bitmap bitmap) { TextView tv = (TextView) holder.holdAndGetView(R.id.tv); tv.setText(s); ImageView iv = (ImageView) holder.holdAndGetView(R.id.iv); iv.setImageBitmap(bitmap); } }; mRv.setAdapter(adapter); mRv.setLayoutManager(new LinearLayoutManager(this));
(github地址:https://github.com/xubinhong/MyRecyclerView4)