`
dengyin2000
  • 浏览: 1228361 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

解决android-Ultra-Pull-To-Refresh下拉刷新组件中嵌套ViewPager的一个bug

阅读更多
在项目中使用了android-Ultra-Pull-To-Refresh组件实现下拉刷新,有个页面是在下拉刷新ListView中包含了一个ViewPager,因为ListView和ViewPager的事件冲突导致ViewPager左右滑动的时候非常难,这是个常见的问题,使用下面改造的ViewPager就能解决这个问题。

package com.myzaker.autoinsurance.ui.view;

import android.content.Context;
import android.os.Debug;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;



/**
 * Created by Denny on 2015/8/1.
 */
public class DisallowParentTouchViewPager extends ViewPager {

    private ViewGroup parent;

    public DisallowParentTouchViewPager(Context context) {
        super(context);
    }

    public DisallowParentTouchViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setNestParent(ViewGroup parent) {
        this.parent = parent;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (parent != null) {
            parent.requestDisallowInterceptTouchEvent(true);
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (parent != null) {
            parent.requestDisallowInterceptTouchEvent(true);
        }
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (parent != null) {
            parent.requestDisallowInterceptTouchEvent(true);
        }
        return super.onTouchEvent(ev);
    }
}



这段代码也很好理解,就是在处理ViewPager touch事件的时候把他的父组件的事件屏蔽掉,这样就只响应了ViewPager touch事件,其实主要是parent.requestDisallowInterceptTouchEvent(true);这句代码的作用,这个是android组件的约定,这个会一级一级的上传,让所有的父组件都不响应touch事件。

但是在android-Ultra-Pull-To-Refresh的PtrFrameLayout上使用上面改造的ViewPager却没有效果,查看PtrFrameLayout源码发现他在实现dispatchTouchEvent方法时,没有考虑到FLAG_DISALLOW_INTERCEPT的因素,导致requestDisallowInterceptTouchEvent方法不起作用。OK,找到了问题点那就改造下PtrFrameLayout好了, 如下:

package com.myzaker.autoinsurance.ui.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;

import in.srain.cube.views.ptr.PtrFrameLayout;

/**
 * Created by Denny on 2015/8/1.
 */
public class FixRequestDisallowTouchEventPtrFrameLayout extends PtrFrameLayout {

    private boolean disallowInterceptTouchEvent = false;

    public FixRequestDisallowTouchEventPtrFrameLayout(Context context) {
        super(context);
    }

    public FixRequestDisallowTouchEventPtrFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FixRequestDisallowTouchEventPtrFrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        disallowInterceptTouchEvent = disallowIntercept;
        super.requestDisallowInterceptTouchEvent(disallowIntercept);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent e) {
        if (disallowInterceptTouchEvent) {
            return dispatchTouchEventSupper(e);
        }
        return super.dispatchTouchEvent(e);
    }
}


继承PtrFrameLayout,当如果调用了requestDisallowInterceptTouchEvent方法,那么dispatchTouchEvent方法就调用dispatchTouchEventSupper,这个其实就是ViewGroup中dispatchTouchEvent的实现。 OK,使用这个FixRequestDisallowTouchEventPtrFrameLayout和DisallowParentTouchViewPager类, 就解决了android-Ultra-Pull-To-Refresh下拉刷新组件和ViewPager事件冲突的问题。
分享到:
评论
2 楼 imknown 2017-01-03  
姚瑶大坏蛋 写道
我也遇到了这个,用你这个方法,导致下拉刷新不起作用了,你遇到过吗?


+1
1 楼 姚瑶大坏蛋 2016-06-07  
我也遇到了这个,用你这个方法,导致下拉刷新不起作用了,你遇到过吗?

相关推荐

    android-Ultra-Pull-To-Refresh

    "android-Ultra-Pull-To-Refresh"是一个高度可定制、性能优秀的下拉刷新库,由开发者精心打造,旨在解决原生Android SDK中SwipeRefreshLayout功能单一的问题。它提供了丰富的动画效果,支持ListView、GridView、...

    下拉刷新,支持嵌套viewpager

    `android-Ultra-Pull-To-Refresh`库解决了这个问题,它允许在下拉刷新视图内部嵌套一个ViewPager,使得用户在顶部下拉时仅触发下拉刷新,而在水平滑动时正常切换ViewPager的页面。这样既保留了下拉刷新的功能,又不...

    android-Ultra-Pull-To-Refresh下拉刷新框架_Eclipse单目录版

    这是现在已经停止维护的下拉刷新项目的替代方案。继承于ViewGroup可以包含任何View。功能比SwipeRefreshLayout强大。 使用起来非常简单。良好的设计,如果你想定制自己的UI样式,非常简单,就像给ListView加一个...

    Ultra-Pull-To-Refresh上拉加载的使用事例

    在Android应用开发中,"Ultra-Pull-To-Refresh"是一个非常实用的库,它扩展了标准的下拉刷新功能,增加了上拉加载更多的特性。这个库由Xiaofei Wang开发,旨在提供更加流畅和自定义化的下拉刷新与上拉加载体验。在这...

    android-Ultra-Pull-To-Refresh例子打包

    "android-Ultra-Pull-To-Refresh"是一个专门针对这一功能的开源库,它为Android开发者提供了一个高效、可定制的下拉刷新解决方案。 该例子打包中包含的"ultra_pulltorefresh"文件可能是一个完整的项目源代码,可以...

    android-Ultra-Pull-To-Refresh-eclipse版本

    android Ultra-Pull-To-Refresh ADT版本 AS版本 链接 https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh 但是还需要个第三方包才能用,地址:https://github.com/liaohuqiu/cube-sdk 感觉代码很多。有...

    Android UI开发第二十一篇——下拉刷新列表实现(pull to refresh)

    在Android应用开发中,下拉刷新(Pull To Refresh)功能是一项常见的UI交互设计,它允许用户通过在列表顶部向下拉动来触发数据的刷新操作。这一功能显著提升了用户体验,尤其是在查看实时信息更新时,如新闻、社交...

    android-Ultra-Pull-To-Refresh-master

    "Ultra Pull To Refresh"是由开发者精心设计的Android库,旨在提供一个统一且灵活的解决方案来处理不同类型的视图(如ListView、GridView、SwipeRefreshLayout等)的下拉刷新需求。它的主要特点是高度可定制化,允许...

    pull-to-refresh下拉刷新

    在移动应用开发中,"Pull-to-Refresh"(下拉刷新)是一种常见的用户交互模式,让用户可以轻松地更新内容。这种功能通常应用于列表视图、网格视图等,当用户向下拉动屏幕时,内容会刷新,展示最新的数据。标题中的...

    Ultra-pull-to-refresh 三方库

    Ultra-pull-to-refresh 是一个流行的开源第三方库,专为Android设计,提供了一种优雅的方式来实现这一功能。本文将深入探讨这个库的实现原理、使用方法以及其在Eclipse环境中的集成。 一、Ultra-pull-to-refresh...

    基于android-Ultra-Pull-To-Refresh的改良的一个下拉刷新库.zip

    Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件...

    react-native-smooth-pull-to-refresh:自定义拉动以刷新React Native的组件

    React本机平滑拉动以刷新 使用为React Native实现拉动刷新组件。 该解决方案仅使用纯Js即可支持iOS和Android。安装安装套件$ npm install --save react-native-smooth-pull-to-refresh# or$ yarn add react-native-...

    [开源][安卓][下拉刷新]Pull-to-Refresh.Rentals-Android-master

    [开源][安卓][下拉刷新]Pull-to-Refresh.Rentals-Android-master

    vue-awesome-pull-refresh:一个下拉刷新组件由vuejs实现。 https

    Vue很棒的拉刷新 一个下拉刷新组件是由vuejs 2.0实现的,用于移动设备。演示版PS:请使用支持Promise的浏览器用法安装npm install vue-awesome-pull-refresh --save普通JS var VuePullRefresh = require ( 'vue-...

    vuepulltorefresh是Vue20上下拉刷新

    `vue-pull-to-refresh` 的核心功能在于提供了一个可定制化的组件,使得开发者可以轻松地在Vue项目中集成上下拉刷新。这个组件监听用户的触摸或滚动事件,当用户上拉或下拉到特定位置时,触发预定义的回调函数,从而...

    pull-to-refresh_下拉刷新.zip 代码

    "Pull-to-refresh",中文通常称为“下拉刷新”,是一种常见的用户界面设计模式,尤其在移动应用和网页中广泛使用。这个模式允许用户通过在页面顶部或底部向下拉动来触发数据的更新,常用于查看最新内容,如社交媒体...

    android-Ultra-Pull-To-Refresh流程图

    作者:【郭孝星】http://blog.csdn.net/allenwells 微博:【郭孝星的新浪微博】http://weibo.com/allenwells 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:...

    android-Ultra-Pull-To-Refresh-docs:android Ultra Pull to Refresh 的文档

    "android Ultra Pull To Refresh-docs"中的"docs"文件夹可能包含了这些文档,指导开发者如何使用CSS来改变刷新指示器的颜色、大小、动画效果等。例如,你可以通过CSS更改背景颜色、字体样式,甚至创建复杂的过渡和...

    Pull-to-Refresh.Rentals-Android开源代码

    "Pull-to-Refresh.Rentals-Android开源代码"是一个针对Android平台的开源项目,它实现了经典的下拉刷新功能,常用于列表视图(ListView)。这个项目源自GitHub,但原版可能需要一定的配置才能在Android环境中正常运行...

    Pull-to-Refresh.Rentals-Android.zip

    总结来说,"Pull-to-Refresh.Rentals-Android.zip"是一个专注于Android平台下拉刷新功能的开源库,由Yalantis团队精心打造。它提供了高度自定义的动画效果,为开发者提供了丰富的资源和代码示例,帮助他们创建出独特...

Global site tag (gtag.js) - Google Analytics