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

成都創(chuàng)新互聯(lián)公司服務(wù)項目包括惠陽網(wǎng)站建設(shè)、惠陽網(wǎng)站制作、惠陽網(wǎng)頁制作以及惠陽網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,惠陽網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到惠陽省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
具體方法如下:
setOnPageChangeListener方法監(jiān)聽,滑到這一頁的時候才刷新這一頁:
public void onPageSelected(int position)
{
ReadFragment fragment= (ReadFragment) fragmentArrayList.get(position);
fragment.refresh();
}不過這樣就只有滑動到這一頁的時候才能用fragmentArrayList.get(position)獲取當(dāng)前頁,用這種方法獲取下一頁的fragment就會報空指針。也就是說無法先緩存刷新下一頁的內(nèi)容。
到底怎么樣才能獲取得到下一頁的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找對應(yīng)的Fragment,如果可以找到就不會去List里面拿了,介于這種情況,我在adapter中加入了這個方法:
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<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里面調(diào)用getFragment(int position)方法,達(dá)到當(dāng)選中這一頁的時候就先緩存刷新下一頁。
getFragment(int position)方法其實就是拿到緩存的fragment,不過就得先保證該fragment已經(jīng)先在viewpager中緩存了,雖然內(nèi)容還沒有刷新,這樣就不會報空指針了。
出現(xiàn)了一個問題,onPageSelected在viewPager展示第一頁的時候是不會調(diào)用的,所以第一頁的內(nèi)容還是得另外刷新,無法在onPageSelected里面刷新。
建立一個方法initData(),在里面刷新。
由于viewPager展示第一頁的時候不會調(diào)用onPageSelected,那也就導(dǎo)致了第一頁和第二頁的內(nèi)容都無法先得到緩存,所以第一頁和第二頁的內(nèi)容都得在initData里面單獨(dú)刷新,其它的通過onPageSelected里面的方法來刷新。
到了這里總結(jié)一下思路:
剛剛進(jìn)入界面的時候:刷新第一頁,緩存第二頁。
翻頁時候:從第一頁翻到第二頁,執(zhí)行onPageSelected()
onPagerSelected里面調(diào)用方法getFragment(int position),獲取到下一頁即第三頁的fragment,然后刷新緩存內(nèi)容。
從第二頁翻到第三頁:執(zhí)行onPageSelected()
onPagerSelected里面調(diào)用方法getFragment(int position),獲取到下一頁即第四頁的fragment,然后刷新緩存內(nèi)容。
結(jié)果又出現(xiàn)了又一個問題:從第一頁翻到第二頁的時候,閃退了,報空指針。
后來調(diào)試了一下發(fā)現(xiàn)getFragment方法得到的fragment為null,沒道理,為啥,想到最后才發(fā)現(xiàn)原來是因為第三頁的fragment在viewPager中沒有緩存,而我們的getFragment是在緩存中通過tag標(biāo)記來拿的。
怎么才能讓第三個fragment在viewPager中實現(xiàn)得到緩存呢?
默認(rèn)的,viewpager在第一頁的時候會緩存第二頁,到了第二頁的時候會緩存第一與第二頁(這里的緩存是指組件不是指內(nèi)容都是一樣的),實踐證明,只有當(dāng)?shù)诙撏耆@示的時候,第三頁才會得到緩存,而onPagerSelected在fragment滑到超過屏幕一半而且我們手指放開了才會調(diào)用,如果我們的手指沒有放開是不會被調(diào)用的,當(dāng)我們的手指放開,onPagerSelected被調(diào)用的時候,第三頁還沒有得到緩存。
怎么辦,我又想到了
@Override public void onPageScrollStateChanged(int state) {}
本認(rèn)為可以在里面判斷state==2,即滑動停止的時候,才緩存刷新這一頁,最后才發(fā)現(xiàn)一樣問題
原來滑動停止指的是手指的滑動,即手指離開屏幕,而不是指改fragment的滑動。
怎么辦,不用怕:還有一個方法:readViewPager.setOffscreenPageLimit(2);
該方法可以給你答案。
這個方法可以設(shè)置viewPager當(dāng)前頁兩邊的緩存數(shù)目,readViewPager.setOffscreenPageLimit(2);當(dāng)前頁左右各緩存2個。viewPager默認(rèn)的是readViewPager.setOffscreenPageLimit(1);
這樣就OK了?,高興太早了。滑到第五頁的時候出問題了,是空白的。改為readViewPager.setOffscreenPageLimit(3);也一樣。
(此時我總共只有4個fragment,我采用的是無限循環(huán)模式,實際的fragment有4個)而實際緩存的有5個fragment(當(dāng)前頁加左右兩個),會不會是這里出問題。
于是我把fragment改為5個,結(jié)果沒問題了。
但是往回翻頁的時候出問題了,翻幾頁后又出現(xiàn)了空白頁,于是我改為6個fragment,才完全沒問題。
看完上述內(nèi)容,你們對怎么在viewPager項目中利用fragment刷新緩存有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
本文題目:怎么在viewPager項目中利用fragment刷新緩存
標(biāo)題路徑:http://chinadenli.net/article26/pgjdjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、定制網(wǎng)站、ChatGPT、營銷型網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)