關於ViewPager的資料更新問題小結

2021-06-08 18:18:02 字數 2106 閱讀 8907

今天工作中遇到了這個糾結的問題,在viewpager中呼叫pageradapter.notifydatasetchanged()方法,好像沒有任何作用,相應的view也沒有更新資料,根據官方api是這樣解釋的:大概是說明adapter會自動管轄viewpager每一頁(item)的狀態,而notifydatasetchanged()是用在當vie pager要新增一頁、刪除一頁或改變各個頁面的排列的時候。所以viewpager adapter的notifydatasetchanged自然就不適用於只更新view pager裡面某個view的內容的需求。對此查閱後終於得到了乙個相對穩定的解決方案,mark一下。

一、一種簡單的解決方案

這種方案我相信只要是對viewpager資料更新問題有研究的都會了解,即覆蓋pageradapter中的getitemposition()方法,這種方案雖然簡單,但是因為這種方法是讓每次呼叫pageradapter時,都會遍歷childview,通過getitemposition()方法返回item位置失去的引數,這樣pageradapter誤認為item失去位置,因而重新建立所有childview,這樣做來,開銷過大,而且由於占用了getitemposition()方法,也不適用於複雜的view介面,只適合textview,edittext等簡單的view。

覆蓋**:

public int getitemposition(object object)

二、pageradapter的工作機制

這裡所說的工作機制,嚴格意義上講就是pageradapter的執行順序,也是leo8573通過除錯自己理解的。

pageradapter作為viewpager的介面卡,無論viewpager有多少頁,pageradapter在初始化時也只初始化開始的2個view,即呼叫2次instantiateitem方法。而接下來每當viewpager滑動時,pageradapter都會呼叫destroyitem方法將距離該頁2個步幅以上的那個view銷毀,以此保證pageradapter最多隻管轄3個view,且當前view是3個中的中間乙個,如果當前view缺少兩邊的view,那麼就instantiateitem,如里有超過2個步幅的就destroyitem。

簡易圖示:

*------+---+---+---+------

... 0 | 1 | 2 | 3 | 4 ...

------+---+---+---+------

當前view為2號view,所以pageradapter管轄1、2、3三個view,接下來向左滑動--> *

------+---+---+---+------

... 1 | 2 | 3 | 4 | 5 ...

------+---+---+---+------

滑動後,當前view變為3號view,pageradapter會destroyitem 0號view,instantiateitem 5號view,所以pageradapter管轄2、3、4三個view

大概就是這樣,各位領會精神吧,leo8573文字表達能力還是有點差。

三、較通用的解決方案

所謂通用的方案,即對於任何viewpager中的view都可以進行資料更新,具體的方法是每當adapter呼叫instantiateitem時,運用view.settag方法將該view標識。當需要更新這個view的資料時,通過呼叫viewpager.findviewwithtag方法找到相應的view,然後更新view中的資料。不能空說不練,最後給上關鍵**,領會精神。

**示例:

@overridepublic object instantiateitem(viewgroup container, int position)   

// 在後續的應用當中,如果要開始更新view pager當中某個view的內容時,需要進行下列動作

textview tvrecord = myviewpager.findviewwithtag("tvrecord1");

// 假設要更新第2頁的textview

// 進行內容更新

if (tvrecord != null ) /* end of if */

上是自己查閱資訊後的小體會,不對的地方請各位朋友指正,leo8573鞠躬**。

關於上下滑動的viewpager

官方的viewpager控制項只能左右滑動,但當我們的專案有需求要求viewpager上下滑動時,怎麼做?當然我們可以自定義乙個viewpager出來,使其支援上下翻頁,但是這無疑比較耗時,我們想很快做出viewpager上下翻動效果,怎麼辦?廢話嘛,第三方呀!乙個是jakewharton寫的dir...

ViewPager動態獲取網路資料

場景 viewpager裡有多個頁面,每個頁面都有網路請求。由於viewpager有預載入性質,所以在第乙個頁面載入的時候,第二個頁面也會進行網路請求,如果有載入進度條的話通常會看到第乙個頁面資料載入完成後載入進度條還在顯示,那是因為第二個頁面還在載入資料,常常讓人不勝其煩。看了一些大牛的部落格發現...

viewpager的pagerAdapter的使用

先看效果圖,簡單說下viewpage的pageradapter的幾個方法的用法 貼上 viewpage的介面卡 class myviewpageadapter extends pageradapter 判斷是否是否為同一張,這裡返回方法中的兩個引數做比較就可以 override public boo...