ListView和RecyclerView容器的自由切换适配

闲来无事,将安卓上用于ListView的传统BaseAdapter按照RecyclerView.Adapter的写法分别继承做了一下统一。有这个想法主要是因为前段时间刚接触RecyclerView,就全部用RecyclerView代替了ListView来用,然而又担心万一RecyclerView不好用要换回ListView怎么办……当然最后证明这种担心多余了,但是之前的适配还是可以分享出来,比较初级,供初学者举一反三参考用。如下:

1.RecyclerView的容器适配基类:


public abstract class ExpoRecyclerAdapter<VH extends ExpoRecyclerAdapter.ViewHolder> extends RecyclerView.Adapter<VH>{
    protected Context context;

    @Override
    public void onBindViewHolder(VH holder, int position){
        holder.onBind(position);
    }

    public abstract class ViewHolder extends RecyclerView.ViewHolder{
        private View rootView;

        public View getView(int id){
            return rootView.findViewById(id);
        }

        public View getRootView(){
            return rootView;
        }

        public abstract void onBind(int position);

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
            rootView = itemView;
        }
    }
}

用于ListView的容器适配基类:

public abstract class ExpoBaseAdapter<VH extends ExpoBaseAdapter.ViewHolder> extends BaseAdapter{
    private HashMap<View, VH> holderKeeper = new HashMap<>();
    @Override
    public int getCount() {
        return getItemCount();
    }

    @Override
    public Object getItem(int i) {
        return i;
    }

    @Override
    public long getItemId(int i){
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        VH holder;
        if(view == null){
            holder = onCreateViewHolder(viewGroup, getItemViewType(i));
            view = holder.rootView;
            holderKeeper.put(view, holder);
            view.setTag(holder);
        }else{
            holder = holderKeeper.get(view);
        }
        onBindViewHolder(holder, i);
        return view;
    }

    public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);

    public abstract void onBindViewHolder(VH holder, int position);

    public abstract int getItemCount();

    public abstract class ViewHolder{
        public View rootView;

        public View getRootView(){
            return rootView;
        }

        public View getView(int id){
            return rootView.findViewById(id);
        }

        public ViewHolder(View view){
            this.rootView = view;
            ButterKnife.bind(this, view);
        }
    }
}

public abstract class ExpoListAdapter<VH extends ExpoListAdapter.ViewHolder> extends ExpoBaseAdapter<VH>{
    @Override
    public void onBindViewHolder(VH holder, int position) {
        holder.onBind(position);
    }

    public abstract class ViewHolder extends ExpoBaseAdapter.ViewHolder{
        public ViewHolder(View view) {
            super(view);
        }

        public abstract void onBind(int position);
    }
}

经过这样的改写之后,ListView和RecyclerView的容器各自继承,当需要切换控件的时候,只需要将继承的父类改变一下,不需要改其他代码了,算是比较方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值