ViewPager(一) 載入機制與優化

2021-10-13 21:02:15 字數 2357 閱讀 2792

前言

以前用viewpager做輪播圖,左右滑動感覺挺流程,沒感覺有卡頓的現象;但實現現在又用viewpager做日曆,日曆的模組全部是用canvas畫出來的,在這裡有一些演算法要去處理,viewpager左右滑動好像沒那麼流暢了。這個時候我就在想如何優化viewpager,盡量讓它左右滑動的時候不那麼卡頓,至少測試不找自己麻煩。先要研究如何優化,那麼就一定要了解viewpager的預載入機制。
正文首先我們將viewpager的可滑動範圍設定為3000,在這裡我故意設定成3000

public yueliadapter(context context, typedarray array, yueliview monthcalendarview, class clzz, resources resources)
@override

public int getcount()

@override

public object instantiateitem(viewgroup container, int position)

那麼初始化的時候,我們發現日誌出現了這麼3條資訊

沒錯就是這3條資訊,最開始的時候列印了1500,我們發現這個數字就是3000的一半,是的,在初始化的時候我們設定了getcount()的數值是3000,那麼在執行instantiateitem(viewgroup container,int position)的時候,這裡面的position的值就是1500,viewpager自動會從position=getcount()/2位置載入最開始的頁面,然後向前預載入乙個頁面,再向後預載入乙個頁面,也就是載入了position=1499的頁面和position=1501的頁面。
我們移動頁面

當我們再向左滑動一頁的時候,那麼這個時候viewpager顯示的是position=1501的頁面,但是它還會再向後面再預載入乙個頁面,也就是position=1502的頁面。如果一直向後就一直預載入,直到當position=3000的時候就不會預載入了。那麼向前預載入也是這樣的原理,當我們的頁面在position=1501這個頁面的時候再向右滑動一頁,那麼當前顯示的就是position=1500的頁面,viewpager也會再向前預載入乙個頁面,也就是position=1499的頁面。

那麼問題就來了,position=1499的這個頁面不是已經載入過了嗎,再載入一遍不是又要浪費效能了嗎?那麼怎麼能讓載入過的頁面不再載入了呢?其實我們可以用sparsearray去儲存載入過的頁面,如果下次再預載入的時候,已經儲存過的頁面就不用在載入了,這樣就不用再耗費效能了、也就沒那麼卡頓了。那麼為什麼用sparsearray而不用hashmap,其實sparsearray效能更好,更加節省記憶體,這裡就不多做解釋了。

public class yueliadapter extends pageradapter 

@override

public int getcount()

@override

public object instantiateitem(viewgroup container, int position)

container.addview( mviews.get( position ) );//從sparsearray裡面獲取頁面view用於顯示

return mviews.get( position );//從sparsearray裡面獲取儲存的頁面view

}public void setskin(class clzz, resources resources)

}public void refresh()

}private int getyearandmonth(int position)

@override

public void destroyitem(viewgroup container, int position, object object)

@override

public boolean isviewfromobject(view view, object object)

public sparsearraygetviews()

public int getmonthcount()

}

ViewPager的預載入設定

在使用viewpager的時候滑動過程中多個fragment會被銷毀之前的,預載入前後兩個頁面,如果想不讓它 頁面也就意味著不用再次請求網路來獲取資源 設定viewpager的介面卡 mpager.setadapter paggeradapter 設定viewpager的初始頁碼是第乙個fragme...

ViewPager懶載入分析推薦

文章說明 本文修改自answerzhao scdn 開發者者公眾平台chian dvlp 概述 在專案中viewpager和fragment介面框架已經是處處可見,但是在使用中,我們肯定不希望使用者在當前頁面時就在前後頁面的資料,加入資料量很大,而使用者又不願意左右滑動瀏覽,那麼這時候viewpag...

ViewPager預載入及其優化

前言 以前用viewpager做輪播圖,左右滑動感覺挺流程,沒感覺有卡頓的現象 但實現現在又用viewpager做日曆,日曆的模組全部是用canvas畫出來的,在這裡有一些演算法要去處理,viewpager左右滑動好像沒那麼流暢了。這個時候我就在想如何優化viewpager,盡量讓它左右滑動的時候不...