为RecyclerView自行添加item的点击事件

RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解一下如何为RecyclerView的item添加点击事件,顺带也复习一下观察者模式。

最终目的:

模拟ListView的setOnItemClickListener()方法,调用者只须调用类似于setOnItemClickListener的东西就能获得被点击item的相关数据。

原理:

为RecyclerView的每个子item设置setOnClickListener,然后在onClick中再调用一次对外封装的接口,将这个事件传递给外面的调用者。而“为RecyclerView的每个子item设置setOnClickListener”在Adapter中设置。其实直接在onClick中也能完全处理item的点击事件,但是这样会破坏代码的整体逻辑性。

步骤:

自定义一个继承自RecyclerView.Adapter的MyAdapter。
1.在MyAdapter中定义如下接口,模拟ListView的OnItemClickListener:

    public interface OnItemClickListener {
        void onItemClick(View view, int position);
    }

然后在在当前Adapter中声明一个这个接口的变量

private OnItemClickListener mOnItemClickListener;
在onCreateViewHolder()中为每个item添加点击事件

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_layout, parent, false);
        MyViewHolder myViewHolder = new MyViewHolder(view);
        view.setOnClickListener(this);//将创建的Vie注册点击事件
        return myViewHolder;
    }
将点击事件转移给外面的调用者

扫描二维码关注公众号,回复: 1555279 查看本文章
    @Override
    public void onClick(View view) {
        if (mOnItemClickListener != null) {
            mOnItemClickListener.onItemClick(view, (int) view.getTag());//注意这里使用getTag方法获取position
        }
    }
注意上面调用接口的onItemClick()中的view.getTag()方法,这需要在onBindViewHolder()方法中设置item的position
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.itemView.setTag(position);//将position保存在itemView的tag中,一边点击时获取
    }

最后暴露给外面的调用者,定义一个设置Listener的方法():

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }
以上所有步骤都发生在自定义的adapter中,典型的观察者模式,有点绕的地方在于,这里涉及到两个观察者模式的使用,view的setOnClickListener本来就是观察者模式,我们将这个观察者模式的事件监听传递给了我们自己的观察者模式。

在Activity中使用:

        mRecyclerAdapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                ToastUtils.success(TestActivity.this,"点击" + position);
            }
        });

好了,到这里为RecyclerView添加item的点击事件就介绍完毕了,是不是很 easy!^_^

总结:
在ListView中我们是调用ListView的setOnItemClickListener:
而在我们这里是调用我们自己定义的mAdapter的setOnItemClickListener。

猜你喜欢

转载自blog.csdn.net/lvshuchangyin/article/details/71107111