1. 程式人生 > >使用RecyclerView + ViewPager 的兩個大坑!

使用RecyclerView + ViewPager 的兩個大坑!

問題

在RecyclerView中使用ViewPager時,會出現兩個詭異的bug:

  1. RecyclerView滾動上去,直至ViewPager看不見,再滾動下來,ViewPager下一次切換沒有動畫
  2. 當ViewPage滾動到一半的時候,RecyclerView滾動上去,再滾動下來,ViewPager會卡在一半

這兩個bug只能用兩個字形容:大坑!

問題1:原因

ViewPager裡有一個私有變數mFirstLayout,它是表示是不是第一次顯示佈局,如果是true,則使用無動畫的方式顯示當前item,如果是false,則使用動畫方式顯示當前item。

看原始碼

void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
    ...
if (mFirstLayout) { // We don't have any idea how big we are yet and shouldn't have any pages either. // Just set things up and let the pending layout handle things. mCurItem = item; if (dispatchSelected) { dispatchOnPageSelected(item); } requestLayout(); } else
{ populate(item); scrollToItem(item, smoothScroll, velocity, dispatchSelected); ... }

當ViewPager滾動上去後,因為RecyclerView的回收機制,ViewPager會走onDetachFromWindow,當再次滾動下來時,ViewPager會走onAttachedToWindow,而問題就出在onAttachToWindow。

看原始碼:

@Override
protected void onAttachedToWindow() {
    super
.onAttachedToWindow(); mFirstLayout = true; }

原來如此,在onAttachedToWindow中,mFirstLayout被重置為true,所以下一次滾動就沒有動畫。

問題1:解決方法

重寫onAttachedToWindow方法,把mFirstLayout再重置成false,因為mFirstLayout是private變數,我們不能直接訪問,所以只能反射了。

@Override
protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    try {
        Field mFirstLayout = ViewPager.class.getDeclaredField("mFirstLayout");
        mFirstLayout.setAccessible(true);
        mFirstLayout.set(this, false);
        getAdapter().notifyDataSetChanged();
        setCurrentItem(getCurrentItem());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

問題2:原因

直接來看ViewPager的onDetachFromWindow方法

@Override
protected void onDetachedFromWindow() {
    removeCallbacks(mEndScrollRunnable);
    // To be on the safe side, abort the scroller
    if ((mScroller != null) && !mScroller.isFinished()) {
        mScroller.abortAnimation();
    }
    super.onDetachedFromWindow();
}

尼瑪,直接把動畫強行停掉了。

問題2:解決方法

想來想去,沒什麼好辦法,只能想辦法保護了

@Override
protected void onDetachedFromWindow() {
    if (hasActivityDestroy) {
        super.onDetachedFromWindow();
    }
}

public void setHasDestroy(boolean hasDestroy) {
    hasActivityDestroy= hasDestroy;
}

當activitydestroy的時候,給自定義ViewPager一個標誌位hasActivityDestroy,只有hasActivityDestroy為true的時候,才呼叫父類的super.onDetachedFromWindow();

總結

這兩個bug看了我好久啊,真是個大坑。。。

相關推薦

使用RecyclerView + ViewPager大坑

問題 在RecyclerView中使用ViewPager時,會出現兩個詭異的bug: RecyclerView滾動上去,直至ViewPager看不見,再滾動下來,ViewPager下一次切換沒有動畫 當ViewPage滾動到一半的時候,RecyclerVi

推薦系統中協同過濾演算法實現分析(重要

“協”,指許多人協力合作。 “協同”,就是指協調兩個或者兩個以上的不同資源或者個體,協同一致地完成某一目標的過程。 “協同過濾”,簡單來說,就是利用興趣相投或擁有共同經驗的群體的喜好來給使用者推薦感興趣的資訊,記錄下來個人對於資訊相當程度的迴應(如評分),以達到過濾的目的,進而幫助別人篩

決定一個程式設計師能走多遠的,不是年齡,而是這原因

都說程式設計師有“中年危機”,說是程式設計師到了30-40歲就開始不吃香了,甚至會被企業淘汰。那麼事實真的是如此嗎?建議大家不妨看看那些程式設計師大腕,哪一個不是50歲上下的。 當然程式設計師是個很燒腦的工作,對自身技術要求很高,如果你到了中年而技術水平還停留在初級階段,那你被淘汰也沒什麼抱怨的

recyclerView載入佈局

一、想要實現載入兩套不同的佈局,只需在getItemViewType方法中返回不同的type,就可以在onCreateViewHolder方法中根據不同的type載入不同的佈局,不同的佈局,也同時也要實現不同的ViewHolder。onBindViewHolder方法也就可以

input標籤只能輸入數字小數點 且小數點後只有位 ,不允許存在小數點

$("#open").on('keyup', function (event) {    var $amountInput = $(this);   var tmptxt=$(this).val();   //$(this).val(tmptxt.subString(0,

AFNetWorking框架使用的“大坑”——修改請求方式和響應方式

引子 AFNetWorking是目前國內開發網路應用使用最多的第三方框架之一(ASI框架也具有其自身優勢),對 NSURLConnection 和NSURLSession 做了封裝(後期維護中逐漸剔除了其中NSURLConnection的應用)。因其提供了豐富

java開發的微信公眾號服務端生產環境中的大坑

摘要: 我們開發的公眾號,由於將功能開發完畢後,未對服務進行壓力測試,因此用到的元件中的引數值全是預設的,服務上線後一段時間執行得倒沒什麼問題,隨著服務得訪問量增加,一些多執行緒併發的問題就逐步暴露出來了,有的問題還非常嚴重。 背景 本文的背景是一個用j

最簡單的cd命令是大坑

BASH Shell 是大多 Linux 發行版的預設 shell,BASH 有一些自己的內建命令,cd 就是其中的一個。 在c

What?一個 Dubbo 服務啟動要小時

前言 前幾天在測試環境碰到一個非常奇怪的與 dubbo 相關的問題,事後我在網上搜索了一圈並沒有發現類似的帖子或文章,於是便有了

判斷雙精度浮點數是否整除

防止 src 溢出 客戶端 market nbsp 道理 有效 無法   這幾天在開發公司項目中,由於屬於期貨產品,所以在此過程中遇到價格和最小單位價格的除法計算。 眾所周知浮點數在計算機中為近視值。比如價格,客戶端輸入的價格為145.5,但是我的服務端斷點顯示為145.4

工具類:關於如何找到List數組中不同的數據的算法

開發人員 uri print clas 數據結構 blank _id integer public 找到兩個List數組中不同的數據的算法! import java.util.ArrayList;import java.util.HashMap;import java.ut

P和P1指向了O和O1變量(對象)的地址, 而不是O和O1的內容(對象的實際地址)——充分證明@是取變量(對象)的地址,而不是變量裏面的內容,夠清楚

com 告訴 cnblogs src logs es2017 strong bsp html 如圖,為什麽這樣取出來的p,p1的值不一樣呢? 165232328群友庾偉洪告訴我: P和P1指向了O和O1兩個變量(對象)的地址, 而不是O和O1的內容(對象

你可能也罵過這面試題

基本 ges term 功能 cto 外包 shadow RoCE 隨著 不知不覺,搞Java開發有7年了,經歷過不少的面試,也面試過不少人.這中間遇到過各種問題,今天就來聊聊其中爭議最大的兩個問題,第一個是大學學歷的問題,我們戲稱為科班與非科班的出身問題;第二個呢就是項目

詳解如何在Centos6和Centos7版本上,執行Cobbler無人值守安裝

信息 cgroup 內容 manager 外網 oar 關聯 done 足夠 Cobbler介紹: Cobbler是一個Linux服務器快速網絡安裝的服務,而且在經過調整也可以支持網絡安裝windows。該工具使用python開發,小巧輕便(才15k行python代碼),可

頁面有RecyclerView無法正常顯示且鑲嵌ScrollView滑動異常問題

上篇文章解決了兩個listview鑲嵌ScrollView出現的滑動問題,後來換為RecyclerView後又出現了問題,頁面同時存在兩個RecyclerView的時候RecyclerView無法正常顯示,外部鑲嵌ScrollView也無法正常滑動。 好了 我的解決方法如下: 首先,需要重寫

《惢客創業日記》2018.09.04(週二) 崩潰的難題

        今天,遇到了兩個難題,一個是2分鐘短視訊的文案,要求在500字左右,結果讓我弄出了2000多字,又是一個心痛的割捨。另一個是短視訊的幕布及補光器材今天剛到貨,時間上有點崩潰,中午回家把所有的拍攝環境都搭好了,手機領夾麥克風要明天才能到貨,看來想

打造一款搶全網紅包現金券指令碼搶了紅包Python也能實現

概述   電商的秒殺、搶購,春運搶票,微信QQ搶紅包,從技術的角度來說,這對於Web 系統是一個很大的考驗. 高併發場景下,系統的優化和穩定是至關重要的. 網際網路的開發包括 Java 後臺、 NoSQL、資料庫、限流、CDN、負載均衡等內容, 目前並沒有權威性

等等 Spring-RabbitMQ 的坑我們已經替你踩了

豔傑。擅長 Python 與 JAVA , 現任餓了麼物流團隊資深 Python 工程師,負責分流核心鏈路, 專注於系統業務分析及穩定性建設。 上次我們分享了我們團隊Java應用Docker化部署GC變長的踩坑經歷,發現還真的幫助很多同學解決了他們專案中同樣的問題。這對我們來說真的是很大的一個激勵

分享小問題

本文首發於個人微信公眾號《andyqian》,期待你的關注! 前言   有好一段時間沒有更新文章了,期間有好幾次提筆。卻又不知,如何下手。今天來分享兩個常見的小問題。 (一) Linux上傳檔案後大小總是為0 kb大小 問題描述:無論是使用xftp工具,還是

同一個電腦安裝jdk版本----本人測試可行

原文地址::https://blog.csdn.net/yuruixin_china/article/details/53607248   相關文章 1、一臺電腦如何配置多個JDK----https://blog.csdn.net/qq_26545305/article/det