Android填坑之路——FragmentPagerAdapter無法更新數(shù)據(jù)

原因分析

在使用ViewPager+FragmentPagerAdapter時候逼庞,更新Fragment里數(shù)據(jù)是不起作用俱诸,F(xiàn)ragmentPagerAdapter添加Fragment、減少Fragment维雇、切換順序時淤刃,前面的Fragment內(nèi)容更新不起作用。這是因為
FragmentPagerAdapter的創(chuàng)建fragment機制所導(dǎo)致的吱型。定位到FragmentPagerAdapter源碼逸贾,其中創(chuàng)建更新fragment的方法是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方法中會根據(jù)itemId生成name來查找fragment是否已經(jīng)存在,如果不存在則創(chuàng)建新的fragment津滞,否則不創(chuàng)建新的fragment铝侵。
itemId是通過getItemId方法獲取的,那么触徐,定位到getItemId方法:

public long getItemId(int position) {
        return position;
    }

getItemId僅僅只是返回當(dāng)前的position咪鲜。這就是FragmentPagerAdapter無法更新的原因了。比如FragmentPagerAdapter有3個fragment锌介, 那么通過getItemId獲取到的itemId就為0, 1嗜诀, 2猾警,這時變更數(shù)據(jù),把第一個fragment的數(shù)據(jù)與第三個fragment交換隆敢,但getItemId獲取到的itemId仍是0, 1发皿, 2,instantiateItem方法里就不會去執(zhí)行新的創(chuàng)建或更新數(shù)據(jù)了拂蝎。這就是FragmentPagerAdapter無法更新數(shù)據(jù)的原因了穴墅。

解決方案

1、暴力移除fragment

ist<Fragment> fragments = getSupportFragmentManager().getFragments();
for (int i = fragments.size() - 1; i >= 0; i--) {
    getSupportFragmentManager().beginTransaction().remove(fragments.get(0));
}

2温自、重寫instantiateItem方法

3玄货、重寫getItemId方法

@Override
public long getItemId(int position) {
    // 獲取當(dāng)前數(shù)據(jù)的hashCode
    int hashCode = data.get(position).hashCode();
    return hashCode;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悼泌,隨后出現(xiàn)的幾起案子松捉,更是在濱河造成了極大的恐慌,老刑警劉巖馆里,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隘世,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸠踪,警方通過查閱死者的電腦和手機丙者,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來营密,“玉大人械媒,你說我怎么就攤上這事∑捞” “怎么了纷捞?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長键俱。 經(jīng)常有香客問我兰绣,道長,這世上最難降的妖魔是什么编振? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮臭埋,結(jié)果婚禮上踪央,老公的妹妹穿的比我還像新娘。我一直安慰自己瓢阴,他們只是感情好畅蹂,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荣恐,像睡著了一般液斜。 火紅的嫁衣襯著肌膚如雪累贤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天少漆,我揣著相機與錄音臼膏,去河邊找鬼。 笑死示损,一個胖子當(dāng)著我的面吹牛渗磅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播检访,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼始鱼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脆贵?” 一聲冷哼從身側(cè)響起医清,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卖氨,沒想到半個月后状勤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡双泪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年持搜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焙矛。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡葫盼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出村斟,到底是詐尸還是另有隱情贫导,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布蟆盹,位于F島的核電站孩灯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逾滥。R本人自食惡果不足惜峰档,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寨昙。 院中可真熱鬧讥巡,春花似錦、人聲如沸舔哪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捉蚤。三九已至抬驴,卻和暖如春炼七,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背布持。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工豌拙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鳖链。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓姆蘸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芙委。 傳聞我的和親對象是個殘疾皇子逞敷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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