關(guān)于FragmentPagerAdapter無法更新Fragment數(shù)的問題

需求描述:學(xué)習(xí)中心—-有個兩個pager师脂,一個參加的課程,一個參加的微專業(yè)。每個pager要求用fragment實現(xiàn)吃警。最外層是一個ViewPager控件糕篇。可以實現(xiàn)下拉刷新功能酌心,如果微專業(yè)列表為null拌消,只顯示參加的課程;不為null則顯示兩個pager頁安券。

分析需求墩崩,這里需要實現(xiàn)的是FragmentPagerAdapter.notifyDataSetChange()可以更新fragment的數(shù)量,有時候可以顯示兩個侯勉,有時候一個鹦筹,每次刷新可能都會不同。

簡單的用正常手段去實現(xiàn)ViewPager+FragmentPagerAdapter去實現(xiàn)址貌,發(fā)現(xiàn)無法做到刷新更新fragment的數(shù)量的問題铐拐。這里需要結(jié)合源碼做一些特殊處理。

先看我寫的adapter:

private classCourseEnrolledFragmentAdapterextendsFragmentPagerAdapter {

publicCourseEnrolledFragmentAdapter(FragmentManager fm) {

super(fm);

}

@Override

publicFragment getItem(inti) {

if(i <mPageList.size()) {

returnmPageList.get(i);

}

return null;

}

@Override

public intgetCount() {

returnmPageList.size();

}

@Override

public intgetItemPosition(Object object) {

if(mPageList!=null&& !mPageList.isEmpty()) {

if(!mPageList.contains(object)) {

returnPOSITION_NONE;

}

}

returnPOSITION_UNCHANGED;

}

@Override

public longgetItemId(intposition) {

returnmPageList.get(position).getFragmentId();

}

@Override

publicCharSequence getPageTitle(intposition) {

if(mTabNames!=null&&mTabNames.length> position) {

returnmTabNames[position];

}

return super.getPageTitle(position);

}

}

這里我重寫了getItemPosition方法练对,mPageList是一個fragment的ArrayList遍蟋。當(dāng)需要remove掉其中一個Fragment的時候,讓getItemPosition返回POSITION_NONE螟凭,意思是該位置的pager已經(jīng)不存在了匿值,需要destoryItemview方法,然后重新getItem赂摆。默然返回的是POSITION_UNCHANGED,pager沒變化钟些,不會刷新當(dāng)前的pager烟号。

做完這一步之后發(fā)現(xiàn),的確刷新后可以隱藏掉該fragment政恍,

mPageList.remove(mFragmentMicroSpecial);

mFragmentAdapter.notifyDataSetChanged();

但是如果再刷新又需要顯示該fragment的話汪拥,然后就出問題了。因為在FragmentPagerAdapter源碼里面

publicObject instantiateItem(ViewGroup container,intposition) {

if(this.mCurTransaction ==null) {

this.mCurTransaction =this.mFragmentManager.beginTransaction();

}

longitemId =this.getItemId(position);

String name = makeFragmentName(container.getId(), itemId);

Fragment fragment =this.mFragmentManager.findFragmentByTag(name);

if(fragment !=null) {

this.mCurTransaction.attach(fragment);

}else{

fragment =this.getItem(position);

this.mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), itemId));

}

if(fragment !=this.mCurrentPrimaryItem) {

fragment.setMenuVisibility(false);

fragment.setUserVisibleHint(false);

}

returnfragment;

}

findFragmentByTag的方式去查找之前的fragment篙耗,發(fā)現(xiàn)之前remove的fragment不為null迫筑,然后又將之前remove掉的fragment attach到view pager里面。但是界面數(shù)據(jù)并沒有刷新宗弯,還是用remove前的數(shù)據(jù)脯燃。

所以,我總結(jié)出的方法就是蒙保,如果要更新FragmentPagerAdapter里的fragment辕棚,不僅僅是remove掉該Fragment,還應(yīng)該給該fragment賦null。這樣如果需要再次顯示該fragment就不會出問題逝嚎。當(dāng)然前提是你有用POSITION_NONE去做處理扁瓢。這還得根據(jù)具體業(yè)務(wù)需求來做。

細(xì)心的朋友可能會發(fā)現(xiàn)我這里重寫了下面的方法

@Override

public longgetItemId(intposition) {

returnmPageList.get(position).getFragmentId();

}

系統(tǒng)默認(rèn)返回的是position补君。

之前有個需求要求參加前的fragment pagers是“介紹”引几、“評價”,點(diǎn)擊參加后fragment pagers要變成“目錄”挽铁,“公告”伟桅。再退選又變回來。這些pagers都是不同的fragment實現(xiàn)的屿储。在當(dāng)前activity去做更新贿讹。

好吧,如果遇到這種需求够掠,你會發(fā)現(xiàn)上面重寫的方法自己實現(xiàn)會幫助到你民褂。因為源碼里的實現(xiàn)是

longitemId =this.getItemId(position);

String name = makeFragmentName(container.getId(), itemId);

Fragment fragment =this.mFragmentManager.findFragmentByTag(name);

具體不多說惯雳,還是多看源碼弧关,根據(jù)具體需求設(shè)計更合適的實現(xiàn)方案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末履澳,一起剝皮案震驚了整個濱河市竖哩,隨后出現(xiàn)的幾起案子哭廉,更是在濱河造成了極大的恐慌,老刑警劉巖相叁,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遵绰,死亡現(xiàn)場離奇詭異,居然都是意外死亡增淹,警方通過查閱死者的電腦和手機(jī)椿访,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虑润,“玉大人成玫,你說我怎么就攤上這事∪鳎” “怎么了哭当?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冗澈。 經(jīng)常有香客問我钦勘,道長,這世上最難降的妖魔是什么亚亲? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任个盆,我火速辦了婚禮脖岛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颊亮。我一直安慰自己柴梆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布终惑。 她就那樣靜靜地躺著绍在,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雹有。 梳的紋絲不亂的頭發(fā)上偿渡,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機(jī)與錄音霸奕,去河邊找鬼溜宽。 笑死,一個胖子當(dāng)著我的面吹牛质帅,可吹牛的內(nèi)容都是我干的适揉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煤惩,長吁一口氣:“原來是場噩夢啊……” “哼嫉嘀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起魄揉,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤剪侮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后洛退,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓣俯,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年兵怯,在試婚紗的時候發(fā)現(xiàn)自己被綠了降铸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡摇零,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桶蝎,到底是詐尸還是另有隱情驻仅,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布登渣,位于F島的核電站噪服,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胜茧。R本人自食惡果不足惜粘优,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一仇味、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雹顺,春花似錦丹墨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽没酣。三九已至王财,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裕便,已是汗流浹背绒净。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偿衰,地道東北人挂疆。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像哎垦,于是被迫代替她去往敵國和親囱嫩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容