android中RecyclerView嵌套问题中,内层RecyclerView区域无法响应Item点击事件
Posted kaolagirl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android中RecyclerView嵌套问题中,内层RecyclerView区域无法响应Item点击事件相关的知识,希望对你有一定的参考价值。
问题描述:
项目需求中要使用到RecyclerView内嵌套RecyclerView布局,但问题是,我点击外层RecyclerView,内层RecyclerView的区域无法响应所在Item的点击事件。
解决方法(方法不同,原理相同)
1.方法一
给内层的RecyclerView设置OnTouchListener,在onTouch中处理外层RecyclerView的Item的触摸事件 onTouchEvent。item已经设置了点击事件,所以在onTouchEvent的事件处理中会调用到item的点击事件。
good_list_rv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return itemView.onTouchEvent(event);
}
});
2.方法二
依然是给内层的RecyclerView设置OnTouchListener,在onTouch中调用外层RecyclerView的Item的 preformClick方法 ,执行外层item的点击事件。
good_list_rv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP){
itemView.performClick();
}
return false;
}
});
3.方法三
这个方法,其实就是在方法二的基础上加了些判断,然后进行封装,代码如下:
/**
* 用于处理 RecyclerView嵌套RecyclerView,内层RecyclerView区域无法响应Item点击问题(内层recyclerview使用)
*/
public class ChildTouchListener implements View.OnTouchListener {
private float downX;
private float downY;
private float touchSlop;
private View view;
public ChildTouchListener(View view){
this.view = view;
touchSlop = ViewConfiguration.get(view.getContext()).getScaledTouchSlop();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()){
case MotionEvent.ACTION_DOWN:
downX = event.getX();
downY = event.getY();
break;
case MotionEvent.ACTION_UP:
if(Math.abs(event.getY()-downY) < touchSlop && Math.abs(event.getX()-downX)<touchSlop){
view.performClick();
}
break;
}
return false;
}
}
使用
good_list_rv.setOnTouchListener(new ChildTouchListener(itemView));
原理总结
上面的方法中,原理都是相同的。
内层的RecyclerView区域点击没响应,是因为RecyclerView内部重写了onTouchEvent方法,导致了上述问题的发生。
然后我们给RecyclerView设置OnTouchListener,那么OnTouchListener中的onTouch方法会在onTouchEvent方法之前回调,并且需要注意onTouch方法的返回值,如果是false,onTouchEvent方法才会被调用,如果是true,那么onTouchEvent方法将不会被调用(也就是给view设置的OnTouchListener的优先级高于onTouchEvent),我们的处理中返回false以便不影响RecyclerView后续onTouchEvent中的固有逻辑。另外onTouchEvent方法中,如果当前View设置的有OnClickListener,那么它的onClick方法会被调用,这也就是方法1中直接调用了itemView的onTouchEvent方法,自然后续会调用到我们设置的OnClickListener中的onClick方法,执行我们想要的业务逻辑。
以上是关于android中RecyclerView嵌套问题中,内层RecyclerView区域无法响应Item点击事件的主要内容,如果未能解决你的问题,请参考以下文章
android中RecyclerView嵌套问题中,内层RecyclerView区域无法响应Item点击事件
Android在开发中的使用技巧之解决ScrollView嵌套RecyclerView出现的系列问题
Android 中ViewPager嵌套RecyclerView出现滑动冲突的解决方案
从 Firestore 中检索嵌套对象并放入 Android 中的 RecyclerView?