Android让多类型Adapter从此变的简单--第二篇

      经过Android让多类型Adapter从此变的简单,虽然在代码层面上减少了adapter的代码,但是在使用的时候还是会遇到一些比较尴尬的问题,比如,现在需要加一个加载更多的item在最后。所以,adapter中的itemType并不是全部依赖于bean的,并且按照之前的方式会对bean有一定的耦合,我们不应该让bean在去实现什么接口,只想单纯的bean而已,所以基于以上两点,进行改进。

    我们需要从新定义ICell接口,代码如下:

public interface ICell<T> {


    boolean isCurType(int position, List<T> mDatas,SmartAdapter adapter);

    @LayoutRes int getLayoutId();

    void onBindViewHolder(ViewHolder holder, int position,List<T> mDatas,SmartAdapter adapter);

}

其中isCurType方法用来根据条件判断是否是该类型,如果是,通过调用getLayoutId返回该类型布局文件id。

再看SmartAdapter代码:

public class SmartAdapter extends RecyclerView.Adapter<ViewHolder> {
    protected List<?> mDatas;
    private List<ICell<?>> itemTypes;
    public SmartAdapter(@NonNull List<?> datas){
        mDatas = datas;
        itemTypes=new ArrayList<>();
    }

    public SmartAdapter regist(ICell<?> bindcell){
        itemTypes.add(bindcell);
        return this;
    }

    public List<?> getDatas(){
        return mDatas;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return ViewHolder.getHolder(parent.getContext(),viewType,parent);
    }

    @Override
    public int getItemViewType(int position) {
        if (itemTypes.size()==0){
            throw new RuntimeException("can not find view type ,please call regist before setAdater");
        }else{
            for (ICell cell:itemTypes) {
                if (cell.isCurType(position,mDatas,this)){
                    return cell.getLayoutId();
                }
            }
            throw new RuntimeException("can not find view type");
        }
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        for (ICell cell:itemTypes) {
            if (cell.isCurType(position,mDatas,this)){
                cell.onBindViewHolder(holder,position,mDatas,this);
            }
        }
    }

}

相信已经一目了然了吧,可能有人会说为什么isCurType方法不将当前位置的数据传入,我想说的是,还是从最开始的那两个痛点出发的,因为不是所有的位置都依赖于当前数据,有时候我就希望某一个位置的条目只显示一个特定的view,跟数据无关,所以我们不能依赖当前位置的数据。

下面是具体使用方法:

        rv_list.setAdapter(new SmartAdapter(datas) {
            @Override
            public int getItemCount() {
                return datas.size() + 1;
            }
        }.regist(new TypeOneCell())
                .regist(new TypeTwoCell())
                .regist(new LoadMoreCell()));
由于添加了加载更多的条目,所以需要重写getItemcount方法;从此以后我只需要实现对应的ICell接口就好了,当然也有大神封装的更好,但是本人本着代码最少,简单的原则,没有过度封装,想更深度封装,就需要你们的聪明的大脑啦。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值