真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在viewPager項(xiàng)目中利用fragment刷新緩存

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

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括惠陽(yáng)網(wǎng)站建設(shè)、惠陽(yáng)網(wǎng)站制作、惠陽(yáng)網(wǎng)頁(yè)制作以及惠陽(yáng)網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,惠陽(yáng)網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到惠陽(yáng)省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

具體方法如下:

setOnPageChangeListener方法監(jiān)聽(tīng),滑到這一頁(yè)的時(shí)候才刷新這一頁(yè):
 public void onPageSelected(int position)
{
 ReadFragment fragment= (ReadFragment) fragmentArrayList.get(position);
 fragment.refresh();
}

不過(guò)這樣就只有滑動(dòng)到這一頁(yè)的時(shí)候才能用fragmentArrayList.get(position)獲取當(dāng)前頁(yè),用這種方法獲取下一頁(yè)的fragment就會(huì)報(bào)空指針。也就是說(shuō)無(wú)法先緩存刷新下一頁(yè)的內(nèi)容。

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

百度了一下好像說(shuō)要在

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中通過(guò)Tag找對(duì)應(yīng)的Fragment,如果可以找到就不會(huì)去List里面拿了,介于這種情況,我在adapter中加入了這個(gè)方法:

 public ReadFragment getFragment(int position)
  {    String tag = getFragmentTag(mContainer.getId(),position);
    ReadFragment fragment = (ReadFragment) fm.findFragmentByTag(tag);
    return fragment;
  }
  /**
   * 運(yùn)用反射機(jī)制調(diào)用FragmentPagerAdapter的getFragmentTag的方法
   * @param viewId
   * @param index
   * @return
   */
  private String getFragmentTag(int viewId, int index)
  {
    try {
      Class 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里面調(diào)用getFragment(int position)方法,達(dá)到當(dāng)選中這一頁(yè)的時(shí)候就先緩存刷新下一頁(yè)。

getFragment(int position)方法其實(shí)就是拿到緩存的fragment,不過(guò)就得先保證該fragment已經(jīng)先在viewpager中緩存了,雖然內(nèi)容還沒(méi)有刷新,這樣就不會(huì)報(bào)空指針了。

出現(xiàn)了一個(gè)問(wèn)題,onPageSelected在viewPager展示第一頁(yè)的時(shí)候是不會(huì)調(diào)用的,所以第一頁(yè)的內(nèi)容還是得另外刷新,無(wú)法在onPageSelected里面刷新。

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

由于viewPager展示第一頁(yè)的時(shí)候不會(huì)調(diào)用onPageSelected,那也就導(dǎo)致了第一頁(yè)和第二頁(yè)的內(nèi)容都無(wú)法先得到緩存,所以第一頁(yè)和第二頁(yè)的內(nèi)容都得在initData里面單獨(dú)刷新,其它的通過(guò)onPageSelected里面的方法來(lái)刷新。

到了這里總結(jié)一下思路:

剛剛進(jìn)入界面的時(shí)候:刷新第一頁(yè),緩存第二頁(yè)。

翻頁(yè)時(shí)候:從第一頁(yè)翻到第二頁(yè),執(zhí)行onPageSelected()

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

              從第二頁(yè)翻到第三頁(yè):執(zhí)行onPageSelected()

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

結(jié)果又出現(xiàn)了又一個(gè)問(wèn)題:從第一頁(yè)翻到第二頁(yè)的時(shí)候,閃退了,報(bào)空指針。

后來(lái)調(diào)試了一下發(fā)現(xiàn)getFragment方法得到的fragment為null,沒(méi)道理,為啥,想到最后才發(fā)現(xiàn)原來(lái)是因?yàn)榈谌?yè)的fragment在viewPager中沒(méi)有緩存,而我們的getFragment是在緩存中通過(guò)tag標(biāo)記來(lái)拿的。

怎么才能讓第三個(gè)fragment在viewPager中實(shí)現(xiàn)得到緩存呢?

默認(rèn)的,viewpager在第一頁(yè)的時(shí)候會(huì)緩存第二頁(yè),到了第二頁(yè)的時(shí)候會(huì)緩存第一與第二頁(yè)(這里的緩存是指組件不是指內(nèi)容都是一樣的),實(shí)踐證明,只有當(dāng)?shù)诙?yè)完全顯示的時(shí)候,第三頁(yè)才會(huì)得到緩存,而onPagerSelected在fragment滑到超過(guò)屏幕一半而且我們手指放開(kāi)了才會(huì)調(diào)用,如果我們的手指沒(méi)有放開(kāi)是不會(huì)被調(diào)用的,當(dāng)我們的手指放開(kāi),onPagerSelected被調(diào)用的時(shí)候,第三頁(yè)還沒(méi)有得到緩存。

怎么辦,我又想到了

@Override public void onPageScrollStateChanged(int state) {}

本認(rèn)為可以在里面判斷state==2,即滑動(dòng)停止的時(shí)候,才緩存刷新這一頁(yè),最后才發(fā)現(xiàn)一樣問(wèn)題

原來(lái)滑動(dòng)停止指的是手指的滑動(dòng),即手指離開(kāi)屏幕,而不是指改fragment的滑動(dòng)。

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

該方法可以給你答案。

這個(gè)方法可以設(shè)置viewPager當(dāng)前頁(yè)兩邊的緩存數(shù)目,readViewPager.setOffscreenPageLimit(2);當(dāng)前頁(yè)左右各緩存2個(gè)。viewPager默認(rèn)的是readViewPager.setOffscreenPageLimit(1);

這樣就OK了?,高興太早了?;降谖屙?yè)的時(shí)候出問(wèn)題了,是空白的。改為readViewPager.setOffscreenPageLimit(3);也一樣。

(此時(shí)我總共只有4個(gè)fragment,我采用的是無(wú)限循環(huán)模式,實(shí)際的fragment有4個(gè))而實(shí)際緩存的有5個(gè)fragment(當(dāng)前頁(yè)加左右兩個(gè)),會(huì)不會(huì)是這里出問(wèn)題。

于是我把fragment改為5個(gè),結(jié)果沒(méi)問(wèn)題了。

但是往回翻頁(yè)的時(shí)候出問(wèn)題了,翻幾頁(yè)后又出現(xiàn)了空白頁(yè),于是我改為6個(gè)fragment,才完全沒(méi)問(wèn)題。

看完上述內(nèi)容,你們對(duì)怎么在viewPager項(xiàng)目中利用fragment刷新緩存有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


網(wǎng)站題目:怎么在viewPager項(xiàng)目中利用fragment刷新緩存
文章地址:http://weahome.cn/article/pgjdjg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部