Android中RecyclerView嵌套滑动冲突解决的代码片段
程序员文章站
2024-02-25 22:30:51
在纵向recyclerview嵌套横向recyclerview时,如果纵向recyclerview有下拉刷新功能,那么内部的横向recyclerview的横向滑动体验会很差...
在纵向recyclerview嵌套横向recyclerview时,如果纵向recyclerview有下拉刷新功能,那么内部的横向recyclerview的横向滑动体验会很差.(只有纯横向滑动时,才能滑动内部的横向recyclerview,否则滑动事件就会影响到下拉刷新),添加拦截判断.
public class myswiperefreshlayout extends swiperefreshlayout { private boolean misvpdragger; private final int mtouchslop; private float starty; private float startx; public myswiperefreshlayout(context context) { super(context); mtouchslop = viewconfiguration.get(context).getscaledtouchslop(); } public myswiperefreshlayout(context context, attributeset attrs) { super(context, attrs); mtouchslop = viewconfiguration.get(context).getscaledtouchslop(); } @override public boolean onintercepttouchevent(motionevent ev) { int action = ev.getaction(); switch (action) { case motionevent.action_down: // 记录手指按下的位置 starty = ev.gety(); startx = ev.getx(); // 初始化标记 misvpdragger = false; break; case motionevent.action_move: // 如果viewpager正在拖拽中,那么不拦截它的事件,直接return false; if (misvpdragger) { return false; } // 获取当前手指位置 float endy = ev.gety(); float endx = ev.getx(); float distancex = math.abs(endx - startx); float distancey = math.abs(endy - starty); // 如果x轴位移大于y轴位移,那么将事件交给viewpager处理。 if (distancex > mtouchslop && distancex > distancey) { misvpdragger = true; return false; } break; case motionevent.action_up: case motionevent.action_cancel: // 初始化标记 misvpdragger = false; break; } // 如果是y轴位移大于x轴,事件交给swiperefreshlayout处理。 return super.onintercepttouchevent(ev); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。