您的位置:首页 > 其它

RecyclerView设置点击监听器OnClickListener

2016-05-13 08:24 369 查看
Android现在越来越广泛的使用RecyclerView来实现更好的布局效果(比如瀑布流、卡片。。。)。但是RecyclerView的数据适配器RecyclerView.Adapter跟传统的BaseAdapter、ArrayAdapter之类的数据适配器有些不同,这也造成了在为子项添加View事件监听器时有些棘手,相信大家平时在使用当中也能感受得到。

为什么这么说呢?

1. 传统的的适配器中,我们一般都是在getView()方法中为相应的View添加各种监听器,对不同的View做适配处理。

View getView(int position, View convertView, ViewGroup parent);
而getView()传入了对添加事件监听器来说极其重要的两个参数,一个是在View集(通过DataSetObserver同数据集相关联)中的位置参数position, 另外则是需要适配的子View引用。因此我可以很方便的就直接添加上了事件监听器,比方说OnClickListener可以直接 convertView.setOnClickListener(View.OnclickListner), 然后在点击回调里面通过position来取到数据集当中相应的数据。

但是在RecyclerView却没有这么容易了,在同View适配密切相关的函数中:

public void onBindViewHolder(ViewHolder viewHolder, int position)
只有一个ViewHolder(用来持有RecyclerView子项里面的各种View引用)和 position, position参数有了,我们可以通过position取到数据,但是却没有了子项View, 而只有一个持有子项内子View引用的Holder.

那么我们是不是就不能为子项View添加事件监听器了呢?当然不是!

这里我们就要好好的利用这一个ViewHolder来实现添加事件监听器。

public class ViewHolder extends RecyclerView.ViewHolder {
private RelativeLayout mRlContent;
private ImageView mThumbIv;
假设我们在子项里面定义了这样一个布局,mRlContent对应的是父布局,mThumbIv是它的子View. 那么我可以在onBindViewHolder里面这样来玩:

viewHolder.mThumbIv.setTag(position);
viewHolder.mThumbIv.setOnClickListener(View.OnclickListener);
注:这里对于ViewHolder变量的设置最好通过公有方法而不是直接调用,除非你将该ViewHolder做成内部类只在该数据适配器RecyclerView.Adapter中使用。

而添加的事件监听器你需要做一些处理,以OnClickListener举例:

private class ItemClickListener implements View.OnClickListener {

@Override
public void onClick(View v) {
int position = (int) v.getTag();
//点击相应的子项View将会回调到这里,你可以取出数据并作出相应的处理.
//在多个View使用同一个监听器时,你需要对View进行识别,View.getId()方法将能非常有效的帮助你。
}
}<pre name="code" class="java">    private ItemClickListener mItemClickListener;



至此,你就已经为RecyclerView添加上了一个Click事件的监听器,并能够在监听回调函数中从数据集取到正确的数据以进一步处理。

这里对于View.getTag() 和 View.setTag()的使用请看我另外一篇博文:View.getTag()和View.setTag()使用指南
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息