众所周知 RecyclerView 比listview 要强大很多,现在多数android开发人员都使用RecyclerView 代替listview 。但在刚开始使用过程相信大家都遇到这个问题 ,就是RecyclerView 没有自带点击事件(onItemClick)和长按事件(onItemLongClick),
在这里把自己的写法分享出来,希望对部分刚接触的开发者有帮助。
第一种方式:
通过OnItemTouchListener自定义 点击接口。如下
/**
* 自定义手势监听
*/
public class RecyclerViewClickListener implements RecyclerView.OnItemTouchListener {
// GestureDetectorCompat 是为了版本兼容
private GestureDetectorCompat mGestureDetector;
private OnItem2ClickListener mListener;
//自定义内部监听
public interface OnItem2ClickListener {
//单击
void onItemClick(View view, int position);
//长按
void onItemLongClick(View view, int position);
}
public RecyclerViewClickListener(Context context, final RecyclerView mRecyclerView, OnItem2ClickListener listener) {
this.mListener = listener;
// SimpleOnGestureListener 是为了选择重写需要的方法
mGestureDetector = new GestureDetectorCompat(context, new GestureDetector.SimpleOnGestureListener() {
//单击事件
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.i("mGestureDetector","onSingleTapUp");
View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
if (childViewUnder != null && mListener != null) {
mListener.onItemClick(childViewUnder, mRecyclerView.getChildLayoutPosition(childViewUnder));
return true;
}
return false;
}
//长按事件
@Override
public void onLongPress(MotionEvent e) {
Log.i("mGestureDetector","onLongPress");
View childView = mRecyclerView.findChildViewUnder(e.getX(),e.getY());
if(childView != null && mListener != null){
mListener.onItemLongClick(childView,mRecyclerView.getChildLayoutPosition(childView));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
//是否拦截事件交给 mGestureDetector 处理
if(mGestureDetector.onTouchEvent(e)){
return true;
}else
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
在activity 集成接口OnItem2ClickListener,并实现方法。
public class MessageFragment extends BaseFragment implements RecyclerViewClickListener.OnItem2ClickListener{
@Override
public void onItemClick(View view, int postion) {
}
@Override
public void onItemLongClick(View view, int position) {
}
}
第二种
在adapter种实现接口 具体实现可以看我以前的的另一篇文章。
https://blog.csdn.net/qq_36355271/article/details/86242606
//activity通过 实现adapter中的接口 已达到控制效果。