欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中RecyclerView嵌套滑动冲突解决的代码片段

程序员文章站 2024-02-28 10:35:52
在纵向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);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。