Listview 嵌套 Viewpager 滑动冲突的解决

做项目时遇到ListView嵌套ViewPager的情况,直接使用V4包中的ViewPager导致ViewPager不能滑动的情况,

通过上网查资料这明显是ListView和ViewPager的滑动冲突导致的。通过上网查资料,需要重写ViewPager解决这个问题。但是解决办法并没有那么完美。

通过重写ViewPager的dispatchTouchEvent方法,让其返回true,getParent().requestDisallowInterceptTouchEvent(true);让ViewPager消费自身的事件。此方法取得一定的效果,ViewPager可以横向滑动了,但是当在ViewPager区域上下滑动的时候ListView 并不能下拉刷新,虽然暂时解决了滑动问题,但并不是完美的。

于是我又对重写的ViewPager做了一定的优化。代码如下:

import android.content.Context;

import android.support.v4.view.ViewPager;

import android.util.AttributeSet;

import android.view.MotionEvent;


public class MyViewPager extends ViewPager {

MyViewPager viewPager;


public MyViewPager(Context context) {

super(context);

// TODO Auto-generated constructor stub

}


public MyViewPager(Context context, AttributeSet attrs) {

super(context, attrs);

}


private float xDown;// 记录手指按下时的横坐标。

private float xMove;// 记录手指移动时的横坐标。

private float yDown;// 记录手指按下时的纵坐标。

private float yMove;// 记录手指移动时的纵坐标。

private boolean viewPagerScrolling = false;

private boolean fatherScrolling = false;


@Override

public boolean dispatchTouchEvent(MotionEvent ev) {

// TODO Auto-generated method stub


switch (ev.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:


xDown = ev.getX();

yDown = ev.getY();


break;

case MotionEvent.ACTION_MOVE:

xMove = ev.getX();

float yMove = ev.getY();

if (Math.abs(yMove - yDown) < Math.abs(xMove - xDown)

&& Math.abs(xMove - xDown) > 2) {

getParent().requestDisallowInterceptTouchEvent(true);


} else {

getParent().requestDisallowInterceptTouchEvent(false);


}


break;

case MotionEvent.ACTION_UP:


this.getParent().requestDisallowInterceptTouchEvent(false);

break;

}

return super.dispatchTouchEvent(ev);

}

}

这个是判断手指落下和抬起时移动的X,Y 的坐标,如果X方向上移动较大且大于2的情况下就认定为横向滑动,由ViewPager自行消费。否则由ListView消费。 通过对移动坐标的判断,实现了ViewPager既能左右滑动,又能实现ListView的下拉刷新。
  这个改动暂时解决了我的问题,也许解决办法不是完美的,也希望对大家有帮助,或者有更好解决办法的可以告诉我哦。。
  转载请注明出处。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值