Android打造自己的RecyclerView之解耦JavaBean(二)

这里是和别人的万能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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值