直播app系统源码,RecyclerView 梳理,点击、长按事件触发的条件
直播app系统源码,RecyclerView 梳理,点击、长按事件触发的条件
RecyclerView 的 api 虽然没有提供 onItemClickListener 但是提供了 addOnItemTouchListener() 方法,既然可以添加触摸监听,那么我们完全可以获取触摸手势来识别点击事件,然后通过触摸坐标来判断点击的是哪一个item。
mRecyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(mRecyclerView) { @Override public void onItemClick(RecyclerView.ViewHolder viewHolder) { //TODO item 点击事件 } @Override public void onLongClick(RecyclerView.ViewHolder viewHolder) { //TODO item 长按事件 } });
其中 OnRecyclerItemClickListener 是自定义的一个触摸监听器,代码如下:
public abstract class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener{ private GestureDetectorCompat mGestureDetectorCompat;//手势探测器 private RecyclerView mRecyclerView; public OnRecyclerItemClickListener(RecyclerView recyclerView) { mRecyclerView = recyclerView; mGestureDetectorCompat = new GestureDetectorCompat(mRecyclerView.getContext(), new ItemTouchHelperGestureListener()); } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { mGestureDetectorCompat.onTouchEvent(e); return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { mGestureDetectorCompat.onTouchEvent(e); } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } public abstract void onItemClick(RecyclerView.ViewHolder viewHolder); public abstract void onLongClick(RecyclerView.ViewHolder viewHolder); }
GestureDetectorCompat 中传入了一个 ItemTouchHelperGestureListener,代码如下:
private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener{ //一次单独的轻触抬起手指操作,就是普通的点击事件 @Override public boolean onSingleTapUp(MotionEvent e) { View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY()); if (childViewUnder != null) { RecyclerView.ViewHolder childViewHolder = mRecyclerView.getChildViewHolder(childViewUnder); onItemClick(childViewHolder); } return true; } //长按屏幕超过一定时长,就会触发,就是长按事件 @Override public void onLongPress(MotionEvent e) { View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY()); if (childViewUnder != null) { RecyclerView.ViewHolder childViewHolder = mRecyclerView.getChildViewHolder(childViewUnder); onLongClick(childViewHolder); } } }
原理分析
上面的代码很简单没什么复杂的地方,就是通过一个手势探测器 GestureDetectorCompat 来探测屏幕事件,然后通过手势监听器 SimpleOnGestureListener 来识别手势事件的种类,然后调用我们设置的对应的回调方法。这里值得说的是:当获取到了 RecyclerView 的点击事件和触摸事件数据 MotionEvent,那么如何才能知道点击的是哪一个 item 呢?
RecyclerView已经为我们提供了这样的方法:findChildViewUnder()。
我们可以通过这个方法获得点击的 item ,同时我们调用 RecyclerView 的另一个方法 getChildViewHolder(),可以获得该 item 的 ViewHolder,最后再回调我们定义的虚方法 onItemClick() 就ok了,这样我们就可以在外部实现该方法来获得 item 的点击事件了。
以上就是直播app系统源码,RecyclerView 梳理,点击、长按事件触发的条件, 更多内容欢迎关注之后的文章