Android知识Android开发经验谈Android开发

PtrFrameLayout与ViewPager的滑动冲突

2017-05-27  本文已影响1788人  叶林舟

项目地址

android-Ultra-Pull-To-Refresh

问题描述

如代码中的布局嵌套,首页中在PtrFrameLayout中嵌套ListView,在ListViewItem嵌套ViewPager,也就是这三个控件之间的恩恩怨怨,争宠搞事情,滑动冲突可描述为:

https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh
<?xml version="1.0" encoding="utf-8"?>
<PtrClassicFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="@null"
            android:fadingEdge="none"
            android:listSelector="@android:color/transparent"
            android:scrollbarStyle="outsideOverlay" />
</PtrClassicFrameLayout>

解决方案

试过网上的各种解决方法,都没有见效,难道是我用了假的搜索引擎,闲话不再多说,上代码:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mListView.requestDisallowInterceptTouchEvent(true);
            mPtrLayout.setEnabled(false);
            break;
        case MotionEvent.ACTION_MOVE:
            int moveX = (int) ev.getX();
            int moveY = (int) ev.getY();
            //ViewPager滑动
            if (Math.abs(moveX-mDownX) > Math.abs(moveY-mDownY)) {
                mListView.requestDisallowInterceptTouchEvent(true);
                mPtrLayout.setEnabled(false);
            //ListView滑动
            }else {
                mListView.requestDisallowInterceptTouchEvent(false);
                mPtrLayout.setEnabled(true);
            }
            mDownX = moveX;
            mDownY = moveY;
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            mPtrLayout.setEnabled(true);
            break;
    }
    return super.dispatchTouchEvent(ev);
}

总结

纵然网上有无限的资源,适合自己的才是最好的,要善于思考,发现问题的根本原因,进而找出解决方案~

上一篇 下一篇

猜你喜欢

热点阅读