1. 程式人生 > >ViewPager和RecyclerView快取View的問題

ViewPager和RecyclerView快取View的問題

在安卓中ViewPager和RecyclerView是常用控制元件,這兩個控制元件的關鍵特點是存在快取。可以提升App效率,對於重用View來講不必去多次載入View。對於Android系統來說,LayoutInflate載入View本質上是需要時間的,即便這個時間可能會很短。所以對於快取機制來講是很必要的。

但是對於快取View來講需要注意一些的問題。處理不很可能會造成複用上的問題。所以對於複用View來講,當每次拿到這個View的時候就應該重新初始化一下View的狀態,例如,View是否初始化是顯示的,如果是顯示的就設定setVisiable屬性為true,其他屬性也是同理。對於RecyclerView和ViewPager來講可以去禁止快取機制,這樣可以解決複用存在的問題。但是會降低效率,做法不建議採用。並且這種實現方式是比較複雜的。RecyclerView重寫測量高度可以實現,但是對於ViewPager來講就不太好實現。眾所周知ViewPager存在一個setOffscreenPageLimit方法設定快取的頁數。但是通過這個方法是無法禁止掉ViewPager的快取的。

 接下來通過看原始碼可以發現:

* <p>You should keep this limit low, especially if your pages have complex layouts.
 * This setting defaults to 1.</p>
*
 * @param limit How many pages will be kept offscreen in an idle state.
 */
public void setOffscreenPageLimit(int limit) {
    if (limit < DEFAULT_OFFSCREEN_PAGES
) { Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " + DEFAULT_OFFSCREEN_PAGES); limit = DEFAULT_OFFSCREEN_PAGES; } if (limit != mOffscreenPageLimit) { mOffscreenPageLimit = limit; populate(); } }
如果傳入的limit小於DEFAULT_OFFSCREEN_PAGES會設定預設limit為DEFAULT_OFFSCREEN_PAGES。這個值在原始碼中是這樣的
private static final int 
DEFAULT_OFFSCREEN_PAGES = 1;所以快取的最少頁數為1頁。所以採用這種方式無法去掉快取。