1. 程式人生 > >android-Ultra-Pull-To-Refresh重新整理框架與viewpager滑動衝突解決方案

android-Ultra-Pull-To-Refresh重新整理框架與viewpager滑動衝突解決方案

文章概述:

問題描述:

liaohuqiu 開源的 android-Ultra-Pull-To-Refresh 下拉重新整理框架,在使用時,會經常遇到巢狀banner的使用場景,即:子ViewGroup巢狀ViewPager使用,例如:

<com.vic.bmar.widgets.PtrClassicRefreshLayout
    android:id="@+id/pcfl_hot"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v4.widget.NestedScrollView
android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/grey_color" android:scrollbars="none">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation
="vertical">
<!-- 這裡的FrameLayout用作放ViewPager的容器 --> <FrameLayout android:id="@+id/banner" android:layout_width="match_parent" android:layout_height="160dp"/> </LinearLayout> </android.support.v4.widget.NestedScrollView
>
</com.vic.bmar.widgets.PtrClassicRefreshLayout>

PtrClassicRefreshLayout是PtrFrameLayout的子類,預設實現了頭部刷 新時的樣式,可以直接拿來使用。

這時候會與ViewPager發生滑動衝突,ViewPager左右很難滑動,作者已經給出了一種解決方法:

//左右滑動時重新整理控制元件禁止掉
pcflFrameLayout.disableWhenHorizontalMove(true);

這樣做ViewPager可以左右滑動了,但是左右滑動有時還是不好滑動,並且,ViewPager滑動時經常會觸發PtrFrameLayout的重新整理樣式,使用者體驗很差。

解決方案

1. 重寫ViewPager

public class BannerViewPager extends ViewPager {

    private ViewGroup parent;

    public BannerViewPager(Context context) {
        super(context);
        parent= (ViewGroup) getParent();
    }

    public BannerViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        parent= (ViewGroup) getParent();
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                if (parent != null) {
                    //禁止上一層的View不處理該事件,遮蔽父元件的事件
                    parent.requestDisallowInterceptTouchEvent(true);
                }
                break;
            case MotionEvent.ACTION_CANCEL:
                if (parent != null) {
                    //攔截
                    parent.requestDisallowInterceptTouchEvent(false);
                }
                break;

            default:
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
}

2. 重寫PtrClassicRefreshLayout

這裡為了方便,就不自定義重新整理樣式,直接使用PtrClassicRefreshLayout重新整理樣式,如果想重寫重新整理樣式,可以繼承PtrFrameLayout。

public class PtrClassicRefreshLayout extends PtrClassicFrameLayout {
    private boolean disallowInterceptTouchEvent = false;

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

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

    public PtrClassicRefreshLayout(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) {
        switch (e.getAction()) {
            case MotionEvent.ACTION_UP:
                //解除重新整理的遮蔽
                this.requestDisallowInterceptTouchEvent(false);
                break;
        }

        if (disallowInterceptTouchEvent) {
            //事件向下分發給子控制元件,子控制元件會遮蔽掉父控制元件的重新整理
            return dispatchTouchEventSupper(e);
        }

        return super.dispatchTouchEvent(e);
    }
}

直接copy這兩個自定義元件的程式碼使用,再加上作者推薦的設定:

pcflFrameLayout.disableWhenHorizontalMove(true);

即可解決android-Ultra-Pull-To-Refresh下拉重新整理框架與viewpager使用衝突問題.

相關推薦

android-Ultra-Pull-To-Refresh重新整理框架viewpager滑動衝突解決方案

文章概述: 問題描述: liaohuqiu 開源的 android-Ultra-Pull-To-Refresh 下拉重新整理框架,在使用時,會經常遇到巢狀banner的使用場景,即:子ViewGroup巢狀ViewPager使用,例如: <c

android-Ultra-Pull-To-Refresh/SwipeRefreshLayout巢狀ViewPager/ScrollView滑動衝突解決

前戲   每次必不可少的前戲又來了。發文時Android-PullToRefresh這個框架已經停止維護3年了,很多人在關心我們現在用什麼框架好,這裡給大家推薦兩個。一個是可愛可親起可恨的Google官方v4包自帶的SwipeRefreshLa

下拉重新整理上拉載入框架android-Ultra-Pull-To-Refresh

下拉重新整理上拉載入框架:PtrClassicFrameLayout 1、一個優雅的框架實現下拉重新整理上拉載入,學習來源:點選開啟連結 2、如何使用: 2.1、在專案中引入: compile 'com.shizhefei:MVCHelper-UltraRefresh:1

一個強大的下拉重新整理框架android-Ultra-Pull-To-Refresh

最近在學習github上的一個開源專案:android-Ultra-Pull-To-Refresh(下面簡稱UltraPtr) 。這個專案主要用於Android APP中下拉重新整理的功能。 OK,之所以說UltraPtr非常強大,是因為它有以下兩個特點:  1. c

[Android]Ultra-Pull-To-Refresh之listview下拉重新整理、上拉載入的用例-已更新

前言 本次demo的編輯環境為android studio,java1.8 截圖 使用 1.本示例依賴jar如下: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) co

使用 android-Ultra-Pull-To-Refresh 實現 WebView 下拉重新整理

Layout: <?xml version="1.0" encoding="utf-8"?> <in.srain.cube.views.ptr.PtrClassicFrameLayout xmlns:android="http://schemas.a

Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用

com 過程 kcon ava false design cube can out 一.gitHub地址及介紹 https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh android-Ultra-Pull-

解決android-Ultra-Pull-To-RefreshViewPager衝突的問題

由於PtrFrameLayout在dispatchOnTouchEvent中沒有判斷事件攔截的情況,導致PtrFrameLayout如果內部的content包含有ViewPager時會出現翻頁異常困難的情況,參考了網上的多的文章沒有解決,很多都是有bug的,今天在網上看到Sw

android-Ultra-Pull-To-Refresh-下拉自定義顯示動畫1

android-Ultra-Pull-To-Refresh的下拉動畫很炫酷,特別是storehouse style型別的 貼一個自定義的動畫效果-audi車標的logo 效果 具體修改程式碼如下: <string-array name="stor

android-Ultra-Pull-To-Refresh 使用簡介

專案地址https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh 該專案只包含下拉重新整理,可以包裹任何控制元件,如果需要新增上拉載入,可以將包裹的view改為前篇文章的LoadMoreRecyclerView實現

打造自己的下拉重新整理庫(Ultra-Pull-To-Refresh)(一)

上一篇博文打造自己的圖片載入快取庫(Picasso OR Glide)發表之後,非常榮幸得到了部落格專家拭心的肯定,並被轉載到了他的公眾號“安卓進化論”,同時也得到了小組同事們的轉載,在這也非常感謝他們。其實回過頭來看看,實際上自己還是有很多不足和可以改進的地方

Ultra-Pull-To-Refresh超簡單實現自定義動畫(二)

前言 接上一篇部落格,Ultra-Pull-To-Refresh超簡單終極實現下拉重新整理、上拉載入 入門實現(一) 上一篇是實現了簡單的自帶的重新整理和載入功能。但是這樣簡單的動畫往往不能滿足我們的需求,所以這一片用一個京東重新整理的例子來實現自定義,就

Android PtrFrameLayout RecyclerView滑動衝突解決方法

原文地址:https://blog.csdn.net/Simon_Crystin/article/details/80926795   1.背景 2.主要程式碼邏輯 2.1 父View程式碼(PtrFrameLayout) 2.2 子View關鍵程式碼(RecyclerView)

android tv跑馬燈效果HorizontalScrollView焦點衝突解決方案

我整個移動的view是繼承了HorizontalScrollView,但是發現我遙控器向右移動的時候,view沒焦點了,我view裡面有一個跑馬燈效果,就是在有焦點的時候才出現跑馬燈,沒焦點的時候隱藏

android ViewPagerScrollView滑動衝突解決

內部解決法: 重寫ViewPager的dispatchTouchEvent方法判斷滑動傾向 import android.con

NestedScrollViewViewpager滑動衝突

最近實現需求Viewpager實現載入視訊和圖片實現輪播,所實現的介面需要巢狀NestedScrollView,所出現的問題就是:Viewpager可以實現自動輪播,但是不能實現手動輪播,這是我很鬱悶,一想肯定是滑動衝突了,網上也找了很多的解決辦法。後邊得到 NestedScrollView

UICollectionViewCell,UITableViewCell點選tap事件衝突解決方案

當界涉及到到點選螢幕隱藏鍵盤等需要在self.view上新增單擊手勢的時候,如果介面上有UICollectionView或者UITableView就會導致cell的select代理不響應一、這時候如果我們想點選整個collectionView都不響應手勢,可以進行如下操作: 

jsonmodel屬性名系統命名衝突解決方案

如今基本都是客戶端請求伺服器的模式,資料傳遞方式基本都使用JSON的字串方式。然而當我們獲取了伺服器發來的字串時,需要將其轉換成我們的資料模型。由於手動轉換程式碼的繁瑣,就有了一些自動化轉換的第三方開源庫。其中比較有名的有YYModel,JSONModel,Mantle,MJExtension。今天主要說

【朝花夕拾】Android自定義View篇之(七)Android事件分發機制(下)滑動衝突解決方案總結

前言        轉載請宣告,轉自【https://www.cnblogs.com/andy-songwei/p/11072989.html】,謝謝!        前面兩篇文章,花了很大篇幅講解了Android的事件分發機制的

Android功能之第三方Pull-to-Refresh.Rentals-Android下拉重新整理

Usage For a working implementation, Have a look at the Sample Project - sample 1.Include the library as local library project