ViewPager中Fragment 刷新問(wèn)題

項(xiàng)目需求似忧,如下圖


17916601-73a444836e4089ed.jpg

實(shí)現(xiàn)方法

主MainActivity 承載5個(gè)fragment,對(duì)應(yīng)著下面5個(gè)按鈕進(jìn)行切換丈秩,該處使用的fragment的add與hide方法同時(shí)加載盯捌,調(diào)用方法如下:

   private void showFragment(Fragment targetFragment) {
        //如果當(dāng)前fragment和目標(biāo)fragment一致
        if (targetFragment == currentFragment) {
            return;
        }
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        if (currentFragment != null) {
            ft.hide(currentFragment);
        }
        if (targetFragment.isAdded()) {
            //如果目標(biāo)已被添加,直接顯示即可
            ft.show(targetFragment);
        } else {
            //如果未被添加蘑秽,則需添加后顯示
            ft.add(R.id.framelayout, targetFragment).show(targetFragment);
        }
        ft.commitAllowingStateLoss();
        currentFragment = targetFragment;
    }

而首頁(yè)界面對(duì)應(yīng)的是多個(gè)不同tab饺著,用ViewPager 承載fragment進(jìn)行實(shí)現(xiàn),開(kāi)始的時(shí)候使用原始FragmentPagerAdapter,只重寫(xiě)了

    @Override
    public Fragment getItem(int i) {
        return mFragmentList.get(i);
    }

    @Override
    public int getCount() {
        return mFragmentList == null ? 0 : mFragmentList.size();
    }

并在首頁(yè)fragment創(chuàng)建的時(shí)候調(diào)用

        mHomePagerAdapter = new FragmentAdapter(getChildFragmentManager(), mFragmentList);
        viewPager.setAdapter(mHomePagerAdapter);
        viewPager.setCurrentItem(0);
        magicIndicator.onPageSelected(0);

收到數(shù)據(jù)回調(diào)的時(shí)候肠牲,重新如下處理:

    @Override
    public void getUserTypesSuccess(List<TemplateTypeModel> list) {
        mTemplateTypeModels = list;
        Collections.sort(mTemplateTypeModels, (o1, o2) -> o1.getTypeOrder() - o2.getTypeOrder());
        mCommonNavigatorAdapter.notifyDataSetChanged();
        if (mFragmentList == null) mFragmentList = new ArrayList<>();
        mFragmentList.clear();
        for (TemplateTypeModel model : list) {
            mFragmentList.add(TypeListFragment.newInstance(model));
        }
    mHomePagerAdapter.notifyDataSetChanged();
    }

問(wèn)題

界面未收到刷新(這里有個(gè)注意點(diǎn)幼衰,在fragment里承載viewpager要使用getChildFragmentManager)

修改方式:

懷疑為緩存問(wèn)題,實(shí)際也正是viewpager緩存問(wèn)題
嘗試拿到數(shù)據(jù)缀雳,重新設(shè)置adapter

  @Override
    public void getUserTypesSuccess(List<TemplateTypeModel> list) {
        mTemplateTypeModels = list;
        Collections.sort(mTemplateTypeModels, (o1, o2) -> o1.getTypeOrder() - o2.getTypeOrder());
        mCommonNavigatorAdapter.notifyDataSetChanged();
        if (mFragmentList == null) mFragmentList = new ArrayList<>();
        mFragmentList.clear();
        for (TemplateTypeModel model : list) {
            mFragmentList.add(TypeListFragment.newInstance(model));
        }
        mHomePagerAdapter = new FragmentAdapter(getChildFragmentManager(), mFragmentList);
        viewPager.setAdapter(mHomePagerAdapter);
        viewPager.setCurrentItem(0);
        magicIndicator.onPageSelected(0);
    }

問(wèn)題

運(yùn)行發(fā)現(xiàn)更新的時(shí)候渡嚣,可以正常更新數(shù)據(jù),等等肥印,增刪list 數(shù)量的時(shí)候识椰,發(fā)現(xiàn)viewpager中fragment 展示的界面和實(shí)際期望的界面不一樣,莫非還是緩存問(wèn)題深碱,上網(wǎng)經(jīng)過(guò)一番腹鹉,需要設(shè)置adapter 中

    @Override
    public int getItemPosition(@NonNull Object object) {
        return POSITION_NONE;
    }

修改

加入之后,發(fā)現(xiàn)效果不明顯敷硅,繼續(xù)百度功咒,有人說(shuō)要?jiǎng)h除fragmentmanager中的fragment,好吧绞蹦,加入力奋,看一下,繼續(xù)修改

   @Override
    public void getUserTypesSuccess(List<TemplateTypeModel> list) {
        List<Fragment> olds = getChildFragmentManager().getFragments();
        if (olds != null) {
            FragmentTransaction ft = getChildFragmentManager().beginTransaction();//獲得FragmentTransaction 事務(wù)
            for (Fragment f : olds) {
                ft.remove(f); //遍歷刪除fragment
            }
            ft.commit();
            getChildFragmentManager().executePendingTransactions();
        }
        mTemplateTypeModels = list;
        Collections.sort(mTemplateTypeModels, (o1, o2) -> o1.getTypeOrder() - o2.getTypeOrder());
        mCommonNavigatorAdapter.notifyDataSetChanged();
        if (mFragmentList == null) mFragmentList = new ArrayList<>();
        mFragmentList.clear();
        for (TemplateTypeModel model : list) {
            mFragmentList.add(TypeListFragment.newInstance(model));
        }
        mHomePagerAdapter = new FragmentAdapter(getChildFragmentManager(), mFragmentList);
        viewPager.setAdapter(mHomePagerAdapter);
        viewPager.setCurrentItem(0);
        magicIndicator.onPageSelected(0);
    }

運(yùn)行坦辟,完美解決問(wèn)題刊侯,不過(guò)總感覺(jué)不夠優(yōu)雅

使用FragmentStatePagerAdapter

由于FragmentPagerAdapter和FragmentStatePagerAdapter內(nèi)部緩存機(jī)制不一樣,F(xiàn)ragmentStatePagerAdapter是直接銷毀fragment锉走,而不是復(fù)用,具體區(qū)別可以參考 FragmentPagerAdapter與FragmentStatePagerAdapter區(qū)別

        viewPager.setAdapter(mHomePagerAdapter = new FragmentStatePagerAdapter(getChildFragmentManager()) {
            @Override
            public int getCount() {
                return mFragmentList == null ? 0 : mFragmentList.size();
            }

            @Override
            public Fragment getItem(int i) {
                return mFragmentList.get(i);
            }


            @Override
            public int getItemPosition(@NonNull Object object) {
                return POSITION_NONE;
            }
        });

這里可以直接使用notifyDataSetChanged進(jìn)行界面的刷新

  @Override
    public void getUserTypesSuccess(List<TemplateTypeModel> list) {

        mTemplateTypeModels = list;
        Collections.sort(mTemplateTypeModels, (o1, o2) -> o1.getTypeOrder() - o2.getTypeOrder());
        mCommonNavigatorAdapter.notifyDataSetChanged();
        if (mFragmentList == null) mFragmentList = new ArrayList<>();
        mFragmentList.clear();
        for (TemplateTypeModel model : list) {
            mFragmentList.add(TypeListFragment.newInstance(model));
        }
        mHomePagerAdapter.notifyDataSetChanged();
        viewPager.setCurrentItem(0);
        magicIndicator.onPageSelected(0);
    }

總結(jié):

遇到viewpager 使用fragment藕届,界面不刷新的問(wèn)題挪蹭,可以考慮使用FragmentStatePagerAdapter,并重寫(xiě)

      @Override
            public int getItemPosition(@NonNull Object object) {
                return POSITION_NONE;
            }

然后就和使用listview等數(shù)據(jù)刷新行為一致了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末休偶,一起剝皮案震驚了整個(gè)濱河市梁厉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖词顾,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件八秃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肉盹,警方通過(guò)查閱死者的電腦和手機(jī)昔驱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)上忍,“玉大人骤肛,你說(shuō)我怎么就攤上這事∏侠叮” “怎么了腋颠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吓笙。 經(jīng)常有香客問(wèn)我淑玫,道長(zhǎng),這世上最難降的妖魔是什么面睛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任絮蒿,我火速辦了婚禮,結(jié)果婚禮上侮穿,老公的妹妹穿的比我還像新娘歌径。我一直安慰自己,他們只是感情好亲茅,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布回铛。 她就那樣靜靜地躺著,像睡著了一般克锣。 火紅的嫁衣襯著肌膚如雪茵肃。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天袭祟,我揣著相機(jī)與錄音验残,去河邊找鬼。 笑死巾乳,一個(gè)胖子當(dāng)著我的面吹牛您没,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胆绊,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼氨鹏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了压状?” 一聲冷哼從身側(cè)響起仆抵,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后镣丑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舔糖,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年莺匠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了金吗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慨蛙,死狀恐怖辽聊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情期贫,我是刑警寧澤跟匆,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站通砍,受9級(jí)特大地震影響玛臂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜封孙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一迹冤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虎忌,春花似錦泡徙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至挑围,卻和暖如春礁竞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杉辙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工模捂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜘矢。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓狂男,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親品腹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子并淋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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