前言
上一篇文章揭开RecyclerView的神秘面纱(一):RecyclerView的基本使用中,主要讲述了RecyclerView的基本使用方法,不同的布局管理器而造成的多样化展示方式,展示了数据之后,一般都会与用户进行交互,因此我们需要处理用户的点击事件。在ListView和GridView提供了onItemClickListener这个监听器,然而我们查找RecyclerView的API却没有类似的监听器,因此我们需要自己手动处理它的点击事件。
以下提供两种方法来实现处理RecyclerView点击事件的功能,以下代码均基于上一篇文章的代码做出修改。
方法一:利用View.onClickListener及onLongClickListener
利用了java回调机制,这里我们依赖于子Item View的onClickListener及onLongClickListener。
首先对MyAdapter.java代码做出如下修改:
①新建两个内部接口:
public interface OnItemClickListener{
void onItemClick(View view,int position);
}
public interface OnItemLongClickListener{
void onItemLongClick(View view,int position);
}
②新建两个私有变量用于保存用户设置的监听器及其set方法:
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
this.mOnItemClickListener = mOnItemClickListener;
}
public void setOnItemLongClickListener(OnItemLongClickListener mOnItemLongClickListener) {
this.mOnItemLongClickListener = mOnItemLongClickListener;
}
③在onBindViewHolder方法内,实现回调:
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.mTextView.setText(mDataSet.get(position));
//判断是否设置了监听器
if(mOnItemClickListener != null){
//为ItemView设置监听器
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getLayoutPosition(); // 1
mOnItemClickListener.onItemClick(holder.itemView,position); // 2
}
});
}
if(mOnItemLongClickListener != null){
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position = holder.getLayoutPosition();
mOnItemLongClickListener.onItemLongClick(holder.itemView,position);
//返回true 表示消耗了事件 事件不会继续传递
return true;
}
});
}
}
可以看到,这里实际上用到了子Item View的onClickListener和onLongClickListener这两个监听器,如果当前子item view被点击了,会触发点击事件进行回调,然后在①处获取当前点击位置的position值,接着在②号代码处进行再次回调ÿ