下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】怎么在viewPager項目中利用fragment刷新緩存
今天就跟大家聊聊有關怎么在viewPager項目中利用fragment刷新緩存,可能很多人都不太了解,為了讓大家更加了解,在下給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。具體方法如下:setOnPageChangeListener方法監(jiān)聽,滑到這一頁的時候才刷新這一頁:
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(intposition)方法,達到當選中這一頁的時候就先緩存刷新下一頁。getFragment(intposition)方法其實就是拿到緩存的fragment,不過就得先保證該fragment已經先在viewpager中緩存了,雖然內容還沒有刷新,這樣就不會報空指針了。出現了一個問題,onPageSelected在viewPager展示第一頁的時候是不會調用的,所以第一頁的內容還是得另外刷新,無法在onPageSelected里面刷新。建立一個方法initData(),在里面刷新。由于viewPager展示第一頁的時候不會調用onPageSelected,那也就導致了第一頁和第二頁的內容都無法先得到緩存,所以第一頁和第二頁的內容都得在initData里面單獨刷新,其它的通過onPageSelected里面的方法來刷新。到了這里總結一下思路:剛剛進入界面的時候:刷新第一頁,緩存第二頁。翻頁時候:從第一頁翻到第二頁,執(zhí)行onPageSelected()
onPagerSelected里面調用方法getFragment(intposition),獲取到下一頁即第三頁的fragment,然后刷新緩存內容。
從第二頁翻到第三頁:執(zhí)行onPageSelected()
onPagerSelected里面調用方法getFragment(intposition),獲取到下一頁即第四頁的fragment,然后刷新緩存內容。結果又出現了又一個問題:從第一頁翻到第二頁的時候,閃退了,報空指針。后來調試了一下發(fā)現getFragment方法得到的fragment為null,沒道理,為啥,想到最后才發(fā)現原來是因為第三頁的fragment在viewPager中沒有緩存,而我們的getFragment是在緩存中通過tag標記來拿的。怎么才能讓第三個fragment在viewPager中實現得到緩存呢?默認的,viewpager在第一頁的時候會緩存第二頁,到了第二頁的時候會緩存第一與第二頁(這里的緩存是指組件不是指內容都是一樣的),實踐證明,只有當第二頁完全顯示的時候,第三頁才會得到緩存,而onPagerSelected在fragment滑到超過屏幕一半而且我們手指放開了才會調用,如果我們的手指沒有放開是不會被調用的,當我們的手指放開,onPagerSelected被調用的時候,第三頁還沒有得到緩存。怎么辦,我又想到了@OverridepublicvoidonPageScrollStateChanged(intstate){}本認為可以在里面判斷state==2,即滑動停止的時候,才緩存刷新這一頁,最后才發(fā)現一樣問題原來滑動停止指的是手指的滑動,即手指離開屏幕,而不是指改fragment的滑動。怎么辦,不用怕:還有一個方法:readViewPager.setOffscreenPageLimit(2);該方法可以給你答案。這個方法可以設置viewPager當前頁兩邊的緩存數目,readViewPager.setOffscreenPageLimit(2);當前頁左右各緩存2個。viewPager默認的是readViewPager.setOffscreenPageLimit(1);這樣就OK了?,高興太早了?;降谖屙摰臅r候出問題了,是空白的。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 裝修糾紛裝飾補充協(xié)議范本
- 技術合作合同書
- 高中數學 8.2.3 二項分布(2)教學設計 蘇教版選擇性必修第二冊
- 2024年高中地理 第4章 文明旅游 4.4 旅游安全教案 湘教版選修3
- 2024年八年級生物下冊 6.1.2生物對環(huán)境的適應和影響教學設計 (新版)濟南版
- 2023七年級數學上冊 第4章 圖形的初步認識4.1 生活中的立體圖形教案 (新版)華東師大版
- 2024-2025版高中物理 第四章 電磁感應 5 電磁感應現象的兩類情況教案 新人教版選修3-2
- 總部園區(qū)基地物業(yè)管理合同(2篇)
- 銀行防控風險合同(2篇)
- 湘教版福建省福州市八縣(市、區(qū))一中2023-2024學年高一上學期11月期中聯考數學試題
- 主題班會《今天你快樂嗎》PPT
- GB/T 22055.1-2008顯微鏡物鏡螺紋第1部分:RMS型物鏡螺紋(4/5 in×1/36 in)
- 企業(yè)管理資料范本-車輛管理檔案(一車一檔)
- PPT用中國地圖(可編輯)
- 高速公路常見邊坡防護類型及施工要點課件
- 2022年1月浙江高考英語讀后續(xù)寫試題講解課件(原文解析+范文賞析)
- 臨床實效研究設計
- 裝飾裝修臨水臨電施工方案
- 傳熱學-凝結核沸騰傳熱課件
- 棚戶區(qū)改造入戶調查表
- 招商銀行智慧營銷體系規(guī)劃方案((2022年-2023年)-2022)
評論
0/150
提交評論