更新及替換ViewPager中的Fragment 遇到的坑

下圖是要實(shí)現(xiàn)的效果:

星夢(mèng)緣.png

結(jié)果我實(shí)現(xiàn)的結(jié)果:

QQ圖片20170323170637.png
QQ圖片20170323170644.png

切換上面的按鈕礁哄,我希望能夠通過(guò)調(diào)mAdapter.notifyDataSetChanged() 來(lái)觸發(fā) Fragment 頁(yè)面使用新的數(shù)據(jù)調(diào)整或重新生成其內(nèi)容,可是當(dāng)我調(diào)用 notifyDataSetChanged() 后早直,發(fā)現(xiàn)什么都沒(méi)發(fā)生祷肯。fragment的內(nèi)容并沒(méi)有刷新沉填,嘗試各種方法,清空數(shù)據(jù)佑笋,還是不會(huì)更換之前的內(nèi)容

查了下資料:

viewpager和它的adapter是如何配合工作的?

Android.support.v4.app.ViewPager有兩個(gè)adapter:
FragmentPagerAdapter和FragmentStatePagerAdapter:

android.support.v4.app.FragmentPagerAdapter繼承自android.support.v4.view.PagerAdapter翼闹,每頁(yè)都是一個(gè)Fragment,并且所有的Fragment實(shí)例一直保存在Fragment manager中蒋纬。所以它適用于少量固定的fragment猎荠,比如一組用于分頁(yè)顯示的標(biāo)簽。除了當(dāng)Fragment不可見(jiàn)時(shí)蜀备,它的視圖層(view hierarchy)有可能被銷(xiāo)毀外关摇,每頁(yè)的Fragment都會(huì)被保存在內(nèi)存中。
android.support.v4.app.FragmentStatePagerAdapter繼承自android.support.v4.view.PagerAdapter碾阁,每頁(yè)都是一個(gè)Fragment输虱,當(dāng)Fragment不被需要時(shí)(比如不可見(jiàn)),整個(gè)Fragment都會(huì)被銷(xiāo)毀脂凶,除了saved state被保存外(保存下來(lái)的bundle用于恢復(fù)Fragment實(shí)例)宪睹。所以它適用于很多頁(yè)的情況。

FragmentPagerAdapter和FragmentStatePagerAdapter對(duì)Fragment的管理略有不同蚕钦,在詳細(xì)考察二者區(qū)別之前亭病,我們通過(guò)兩種較為直觀的方式先感受下:

FragmentPagerAdapter 繼承自 PagerAdapter,該類(lèi)內(nèi)的每一個(gè)生成的 Fragment 都將保存在內(nèi)存之中嘶居,因此適用于那些相對(duì)靜態(tài)的頁(yè)命贴,數(shù)量也比較少的那種;

FragmentStatePagerAdapter 繼承自 PagerAdapter,當(dāng)頁(yè)面離開(kāi)視線(xiàn)后食听,就會(huì)被消除胸蛛,釋放其資源;而在頁(yè)面需要顯示時(shí)樱报,生成新的頁(yè)面(就像 ListView 的實(shí)現(xiàn)一樣)葬项。這么實(shí)現(xiàn)的好處就是當(dāng)擁有大量的頁(yè)面時(shí),不必在內(nèi)存中占用大量的內(nèi)存迹蛤。

解決方案:

不用 FragmentPagerAdapter民珍,而改用 FragmentStatePagerAdapter襟士,并且重載 **getItemPosition() **并返回 POSITION_NONE,以觸發(fā)銷(xiāo)毀對(duì)象以及重建對(duì)象嚷量。從上面的分析中看陋桂,后者給出的建議確實(shí)可以達(dá)到調(diào)用 notifyDataSetChanged() 后,F(xiàn)ragment 被以新的參數(shù)重新建立的效果蝶溶。

package com.xzqn.zhongchou.adapter;



import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.PagerAdapter;

import com.xzqn.zhongchou.base.BaseFragment;
import com.xzqn.zhongchou.fragment.ActorDetailFm;

import java.util.ArrayList;

/**
 * Created by junzhu on 2017/03/23.
 */


public class FragmentDreamAdapter extends FragmentStatePagerAdapter {
    private ArrayList<BaseFragment> fragments;
    private FragmentManager fm;
    public FragmentDreamAdapter(FragmentManager fm, ArrayList<BaseFragment> fragments) {
        super(fm);
        this.fm = fm;
        this.fragments = fragments;
        notifyDataSetChanged();
    }


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

    @Override
    public Fragment getItem(int arg0) {
        return fragments.get(arg0);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }
}

以下是viewpager的代碼


    private void GetRedData(String cate_id) {

        RequestParams params = new RequestParams(Constants.BASEURL_NEW + "notice/cate/cate_id/" + cate_id);
        params.addHeader("token", BaseApplication.getInstance().getLoginUser().getToken());
        params.addHeader("platform", "android");
        params.addHeader("version", Constants.VersionCode);
        x.http().post(params, new Callback.CommonCallback<String>() {

            @Override
            public void onSuccess(String result) {
                try {
                    Gson gson = new Gson();
                    DreamTabTitleBean dreamTabTitleBean = gson.fromJson(result, DreamTabTitleBean.class);

                    if (titleList_red.size() > 0) {
                        titleList_red.clear();
                    }
                    fragmentList.clear();
                    LogUtils.e("fragmentList red",fragmentList+"");
                    LogUtils.e("titleList_red red",titleList_red+"");
                    //有多少個(gè)標(biāo)題就有多少個(gè)碎片嗜历,動(dòng)態(tài)添加
                    for (int i = 0; i < dreamTabTitleBean.getCate_list().size(); i++) {
                        titleList_red.add(dreamTabTitleBean.getCate_list().get(i).getName());
                        int flag = Integer.parseInt(dreamTabTitleBean.getCate_list().get(i).getId());
                        Dream_red_peopleFragment testFm1 = new Dream_red_peopleFragment().newInstance(titleList_red, flag);
                        fragmentList.add(testFm1);
                    }

                    FragmentDreamAdapter fragmentDreamAdapter = new FragmentDreamAdapter(getActivity().getSupportFragmentManager(), fragmentList);
                    mViewPager.removeAllViews();
                    mViewPager.removeAllViewsInLayout();

                    mViewPager.setAdapter(fragmentDreamAdapter);//new FragmentDreamAdapter(getActivity().getSupportFragmentManager(), fragmentList)

                    tab.setupWithViewPager(mViewPager);
                    tab.setTabMode(TabLayout.MODE_FIXED);
                    for (int i = 0; i < titleList_red.size(); i++) {
                        tab.getTabAt(i).setText(titleList_red.get(i));
                    }

                    onFinished();
                } catch (Exception e) {
                    LogUtils.showErrorTip(e.getCause());
                    onError(null, false);
                }
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                LogUtils.showErrorTip(ex);
            }


            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {
            }
        });


    }

實(shí)現(xiàn)的效果:

demo.gif

填充測(cè)試數(shù)據(jù)后的效果:

最終效果.gif

如果代碼中有什么問(wèn)題,也歡迎大家評(píng)判指出抖所!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梨州,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子田轧,更是在濱河造成了極大的恐慌暴匠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傻粘,死亡現(xiàn)場(chǎng)離奇詭異每窖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)弦悉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)岛请,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人警绩,你說(shuō)我怎么就攤上這事崇败。” “怎么了肩祥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵后室,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我混狠,道長(zhǎng)岸霹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任将饺,我火速辦了婚禮贡避,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘予弧。我一直安慰自己刮吧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布掖蛤。 她就那樣靜靜地躺著杀捻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚓庭。 梳的紋絲不亂的頭發(fā)上致讥,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天仅仆,我揣著相機(jī)與錄音,去河邊找鬼垢袱。 笑死墓拜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的请契。 我是一名探鬼主播咳榜,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姚糊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起授舟,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤救恨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后释树,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肠槽,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年奢啥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秸仙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桩盲,死狀恐怖寂纪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赌结,我是刑警寧澤捞蛋,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站柬姚,受9級(jí)特大地震影響拟杉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜量承,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一搬设、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撕捍,春花似錦拿穴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至阀蒂,卻和暖如春该窗,著一層夾襖步出監(jiān)牢的瞬間弟蚀,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工酗失, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留义钉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓规肴,卻偏偏與公主長(zhǎng)得像捶闸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拖刃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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