DataBinding使用指南(三)Listview、RecycleView通用Adapter

DataBinding使用指南(三)ListView、RecycleView通用Adapter

在第一章DataBinding使用指南(一)DataBinding基本使用,双向绑定,ListView RecycleView使用 中我们发现 ListView和RecycleView 的Adapter中代码都极其相似并和不同数据无特别大的牵扯。故我们想应该可以使用 DataBinding 写出一个通用Adapter

ListView 通用Adapter

我们直接上代码

/**
 * 基于 DataBinding 的通用 Adapter
 */
public class CommonListAdapter<T> extends BaseAdapter {

    private ObservableList<T> observableList;
    private int variableId;
    private @LayoutRes int layoutId;

    public CommonListAdapter(@NonNull ObservableList<T> observableList, int variableId, @LayoutRes int layoutId) {
        this.observableList = observableList;
        this.variableId = variableId;
        this.layoutId = layoutId;
    }

    @Override
    public int getCount() {
        return observableList == null ? 0 : observableList.size();
    }

    @Override
    public T getItem(int position) {
        return observableList.get(position);
    }

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

    @Nullable
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        ViewDataBinding binding;
        if (convertView == null) {
            //这里的最后一个参数必须为 false
            binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), layoutId, parent, false);
            convertView = binding.getRoot();
        } else {
            binding = DataBindingUtil.getBinding(convertView);
        }
        binding.setVariable(variableId, getItem(position));
        return convertView;
    }
}

使用方法和普通Adapter的使用方法相同。注意一下构造函数的参数

  • observableList这个自然是数据源;
  • variableId 这个是 变量的id值列表,类似于R。这个参数用在这里binding.setVariable(variableId, getItem(position)); 当你的数据项是User的时候,这个参数就会是BR.user
  • layoutId 布局的ID

RecycleView 通用 Adapter

我还是喜欢直接上代码,如果你看不懂代码可以再来问我。

public class CommonRecycleViewAdapter<T> extends RecyclerView.Adapter {
    private ObservableList<T> observableList;
    private int variableId;
    private @LayoutRes int layoutId;
    private OnRecycleViewItemClickListener onRecycleViewItemClickListener;

    public CommonRecycleViewAdapter(@NonNull ObservableList<T> observableList, int variableId, @LayoutRes int layoutId) {
        this.observableList = observableList;
        this.variableId = variableId;
        this.layoutId = layoutId;
        observableList.addOnListChangedCallback(new BaseOnListChangeCallback());
    }

    @NonNull
    @Override
    public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        //这里的第四个参数必须为 false 这在Google
        ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), layoutId, viewGroup, false);
        return new BaseViewHolder(binding.getRoot());
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {
        ViewDataBinding binding = DataBindingUtil.getBinding(viewHolder.itemView);
        binding.setVariable(variableId, observableList.get(i));
        //设置item点击监听
        binding.getRoot().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onRecycleViewItemClickListener != null) {
                    onRecycleViewItemClickListener.itemClick(observableList.get(i), i);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return observableList != null ? observableList.size() : 0;
    }

    class BaseViewHolder extends RecyclerView.ViewHolder {

        public BaseViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }

    public OnRecycleViewItemClickListener getOnRecycleViewItemClickListener() {
        return onRecycleViewItemClickListener;
    }

    public void setOnRecycleViewItemClickListener(OnRecycleViewItemClickListener onRecycleViewItemClickListener) {
        this.onRecycleViewItemClickListener = onRecycleViewItemClickListener;
    }

    //数据变化监听
    class BaseOnListChangeCallback extends ObservableList.OnListChangedCallback {

        @Override
        public void onChanged(ObservableList sender) {
        }

        @Override
        public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) {
            CommonRecycleViewAdapter.this.notifyItemRangeChanged(positionStart, itemCount);
        }

        @Override
        public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) {
            CommonRecycleViewAdapter.this.notifyItemRangeInserted(positionStart, itemCount);
        }

        @Override
        public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) {
            CommonRecycleViewAdapter.this.notifyItemMoved(fromPosition, toPosition);
        }

        @Override
        public void onItemRangeRemoved(ObservableList sender, int positionStart, int itemCount) {
            CommonRecycleViewAdapter.this.notifyItemRangeRemoved(positionStart, itemCount);
        }
    }

    /**
     * RecycleView 的 Item 点击监听
     * @param <T>
     */
    interface OnRecycleViewItemClickListener<T> {
        /**
         *
         * @param item 点击的 Item 对应的数据
         * @param position 点击的 Item 位置
         */
        void itemClick(T item, int position);
    }
    
}

用法和普通的Adapter是一样的。参数的含义和上面ListView的一样。
这里我还贴心的加上了一个 Item 的点击监听。你只要在Activity中为Adapter设置这个监听就可以了。
来,看代码

        adapter.setOnRecycleViewItemClickListener(new CommonRecycleViewAdapter.OnRecycleViewItemClickListener<User>() {
            @Override
            public void itemClick(User item, int position) {
                System.out.println(item.getName());
            }
        });

好了,经过上面这些乱七八糟的操作 ListView、RecycleView的通用Adapter就完成了。这样我们就可以省去很多的重复性代码。简直nice啊。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值