Android-RecycleView的item点击事件

来源:互联网 发布:jquery 数据可视化 编辑:程序博客网 时间:2024/05/01 11:43

RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件,这就需要开发者自己实现。博客最下面有Demo程序运行动画。

因为ViewHolder我们可以拿到每个Item的根布局,所以如果我们为根布局设置单独的OnClick监听并将其开放给Adapter,那不就可以在组装RecyclerView时就能够设置ItemClickListener,只不过这个Listener不是设置到RecyclerView上而是设置到Adapter。

给一个测试接口:

String path="http://japi.juhe.cn/joke/content/list.from?key= 874ed931559ba07aade103eee279bb37 &page=2&pagesize=10&sort=asc&time=1418745237";


最终目的

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

原理

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

步骤

adapter中

1.在MyAdapter中定义如下接口,模拟ListView的OnItemClickListener:

//定义一个接口    public  interface OnRecyclerViewItemClickListener {        void onItemClick(View view , String data);    }

声明一个这个接口的变量

private OnRecyclerViewItemClickListener mOnItemClickListener = null;

在onCreateViewHolder()中为每个item添加点击事件

@Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = View.inflate(context, R.layout.recyclerviewitem, null);        MyViewHolder myViewHolder = new MyViewHolder(view);        //将创建的View注册点击事件        view.setOnClickListener(this);        return myViewHolder;    }

将点击事件转移给外面的调用者:

@Override    public void onClick(View view) {        if (mOnItemClickListener != null) {            //注意这里使用getTag方法获取数据            mOnItemClickListener.onItemClick(view,view.getTag().toString());        }    }

注意上面调用接口的onItemClick()中的v.getTag()方法,这需要在onBindViewHolder()方法中设置和item相关的数据

 @Override    public void onBindViewHolder(ViewHolder viewHolder,  int position) {        viewHolder.mTextView.setText(datas[position]);        //将数据保存在itemView的Tag中,以便点击时进行获取        viewHolder.itemView.setTag(datas[position]);    }

最后暴露给外面的调用者,定义一个设置Listener的方法():
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {        this.mOnItemClickListener = listener;    }

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

在Activity中使用

MyRecyclerAdapter adapter=new MyRecyclerAdapter(RecycleActivity.this,data);                recycleview.setAdapter(adapter);                adapter.setOnItemClickListener(new MyRecyclerAdapter.OnRecyclerViewItemClickListener() {                    @Override                    public void onItemClick(View view, String  data) {                        //DO your fucking bussiness here!】                        Toast.makeText(RecycleActivity.this,data,Toast.LENGTH_SHORT).show();                    }                });













1 0