中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在viewPager項目中利用fragment刷新緩存

發布時間:2020-11-27 16:57:59 來源:億速云 閱讀:148 作者:Leah 欄目:移動開發

今天就跟大家聊聊有關怎么在viewPager項目中利用fragment刷新緩存,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

具體方法如下:

setOnPageChangeListener方法監聽,滑到這一頁的時候才刷新這一頁:
 public void onPageSelected(int position)
{
 ReadFragment fragment= (ReadFragment) fragmentArrayList.get(position);
 fragment.refresh();
}

不過這樣就只有滑動到這一頁的時候才能用fragmentArrayList.get(position)獲取當前頁,用這種方法獲取下一頁的fragment就會報空指針。也就是說無法先緩存刷新下一頁的內容。

到底怎么樣才能獲取得到下一頁的fragment呢?

百度了一下好像說要在

FragmentPagerAdapter里面的instantiateItem()處理。于是我看了一下它的源代碼:

@Override
  public Object instantiateItem(ViewGroup container, int position) {
    if (mCurTransaction == null) {
      mCurTransaction = mFragmentManager.beginTransaction();
    }
    final long itemId = getItemId(position);
    // Do we already have this fragment?
    String name = makeFragmentName(container.getId(), itemId);
    Fragment fragment = mFragmentManager.findFragmentByTag(name);
    if (fragment != null) {
      if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
      mCurTransaction.attach(fragment);
    } else {
      fragment = getItem(position);
      if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
      mCurTransaction.add(container.getId(), fragment,
          makeFragmentName(container.getId(), itemId));
    }
    if (fragment != mCurrentPrimaryItem) {
      fragment.setMenuVisibility(false);
      fragment.setUserVisibleHint(false);
    }
    return fragment;
  }

可以看出:instantiateItem方法中并不是直接去List里面拿到Fragment,而是先從FragmentManager中通過Tag找對應的Fragment,如果可以找到就不會去List里面拿了,介于這種情況,我在adapter中加入了這個方法:

 public ReadFragment getFragment(int position)
  {    String tag = getFragmentTag(mContainer.getId(),position);
    ReadFragment fragment = (ReadFragment) fm.findFragmentByTag(tag);
    return fragment;
  }
  /**
   * 運用反射機制調用FragmentPagerAdapter的getFragmentTag的方法
   * @param viewId
   * @param index
   * @return
   */
  private String getFragmentTag(int viewId, int index)
  {
    try {
      Class<FragmentPagerAdapter> cls = FragmentPagerAdapter.class;
      Class<?>[] parameterTypes = { int.class, long.class };
      Method method = cls.getDeclaredMethod("makeFragmentName",
          parameterTypes);
      method.setAccessible(true);
      String tag = (String) method.invoke(this, viewId, index);
      return tag;
    } catch (Exception e) {
      e.printStackTrace();
      return "";
    }
  }

在onPageSelected里面調用getFragment(int position)方法,達到當選中這一頁的時候就先緩存刷新下一頁。

getFragment(int position)方法其實就是拿到緩存的fragment,不過就得先保證該fragment已經先在viewpager中緩存了,雖然內容還沒有刷新,這樣就不會報空指針了。

出現了一個問題,onPageSelected在viewPager展示第一頁的時候是不會調用的,所以第一頁的內容還是得另外刷新,無法在onPageSelected里面刷新。

建立一個方法initData(),在里面刷新。

由于viewPager展示第一頁的時候不會調用onPageSelected,那也就導致了第一頁和第二頁的內容都無法先得到緩存,所以第一頁和第二頁的內容都得在initData里面單獨刷新,其它的通過onPageSelected里面的方法來刷新。

到了這里總結一下思路:

剛剛進入界面的時候:刷新第一頁,緩存第二頁。

翻頁時候:從第一頁翻到第二頁,執行onPageSelected()

              onPagerSelected里面調用方法getFragment(int position),獲取到下一頁即第三頁的fragment,然后刷新緩存內容。

              從第二頁翻到第三頁:執行onPageSelected()

              onPagerSelected里面調用方法getFragment(int position),獲取到下一頁即第四頁的fragment,然后刷新緩存內容。

結果又出現了又一個問題:從第一頁翻到第二頁的時候,閃退了,報空指針。

后來調試了一下發現getFragment方法得到的fragment為null,沒道理,為啥,想到最后才發現原來是因為第三頁的fragment在viewPager中沒有緩存,而我們的getFragment是在緩存中通過tag標記來拿的。

怎么才能讓第三個fragment在viewPager中實現得到緩存呢?

默認的,viewpager在第一頁的時候會緩存第二頁,到了第二頁的時候會緩存第一與第二頁(這里的緩存是指組件不是指內容都是一樣的),實踐證明,只有當第二頁完全顯示的時候,第三頁才會得到緩存,而onPagerSelected在fragment滑到超過屏幕一半而且我們手指放開了才會調用,如果我們的手指沒有放開是不會被調用的,當我們的手指放開,onPagerSelected被調用的時候,第三頁還沒有得到緩存。

怎么辦,我又想到了

@Override public void onPageScrollStateChanged(int state) {}

本認為可以在里面判斷state==2,即滑動停止的時候,才緩存刷新這一頁,最后才發現一樣問題

原來滑動停止指的是手指的滑動,即手指離開屏幕,而不是指改fragment的滑動。

怎么辦,不用怕:還有一個方法:readViewPager.setOffscreenPageLimit(2);

該方法可以給你答案。

這個方法可以設置viewPager當前頁兩邊的緩存數目,readViewPager.setOffscreenPageLimit(2);當前頁左右各緩存2個。viewPager默認的是readViewPager.setOffscreenPageLimit(1);

這樣就OK了?,高興太早了。滑到第五頁的時候出問題了,是空白的。改為readViewPager.setOffscreenPageLimit(3);也一樣。

(此時我總共只有4個fragment,我采用的是無限循環模式,實際的fragment有4個)而實際緩存的有5個fragment(當前頁加左右兩個),會不會是這里出問題。

于是我把fragment改為5個,結果沒問題了。

但是往回翻頁的時候出問題了,翻幾頁后又出現了空白頁,于是我改為6個fragment,才完全沒問題。

看完上述內容,你們對怎么在viewPager項目中利用fragment刷新緩存有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

康保县| 五常市| 翁牛特旗| 浮梁县| 荣成市| 博乐市| 扎兰屯市| 紫阳县| 商河县| 兰西县| 浏阳市| 葫芦岛市| 武城县| 江孜县| 锡林浩特市| 通海县| 沙河市| 政和县| 宜阳县| 郸城县| 洛阳市| 麻城市| 莱州市| 乐平市| 蒙城县| 金华市| 沁水县| 林芝县| 太康县| 龙游县| 同德县| 成武县| 临猗县| 十堰市| 永吉县| 潞西市| 新巴尔虎右旗| 蒙城县| 彭山县| 淮南市| 龙陵县|