直播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 梳理,点击、长按事件触发的条件, 更多内容欢迎关注之后的文章

posted @ 2021-09-13 14:27  云豹科技-苏凌霄  阅读(222)  评论(0编辑  收藏  举报