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

下圖是要實現的效果:

星夢緣.png

結果我實現的結果:

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

切換上面的按鈕,我希望能夠通過調mAdapter.notifyDataSetChanged() 來觸發 Fragment 頁面使用新的數據調整或重新生成其內容,可是當我調用 notifyDataSetChanged() 后,發現什么都沒發生。fragment的內容并沒有刷新,嘗試各種方法,清空數據,還是不會更換之前的內容

查了下資料:

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

Android.support.v4.app.ViewPager有兩個adapter:
FragmentPagerAdapter和FragmentStatePagerAdapter:

android.support.v4.app.FragmentPagerAdapter繼承自android.support.v4.view.PagerAdapter,每頁都是一個Fragment,并且所有的Fragment實例一直保存在Fragment manager中。所以它適用于少量固定的fragment,比如一組用于分頁顯示的標簽。除了當Fragment不可見時,它的視圖層(view hierarchy)有可能被銷毀外,每頁的Fragment都會被保存在內存中。
android.support.v4.app.FragmentStatePagerAdapter繼承自android.support.v4.view.PagerAdapter,每頁都是一個Fragment,當Fragment不被需要時(比如不可見),整個Fragment都會被銷毀,除了saved state被保存外(保存下來的bundle用于恢復Fragment實例)。所以它適用于很多頁的情況。

FragmentPagerAdapter和FragmentStatePagerAdapter對Fragment的管理略有不同,在詳細考察二者區別之前,我們通過兩種較為直觀的方式先感受下:

FragmentPagerAdapter 繼承自 PagerAdapter,該類內的每一個生成的 Fragment 都將保存在內存之中,因此適用于那些相對靜態的頁,數量也比較少的那種;

FragmentStatePagerAdapter 繼承自 PagerAdapter,當頁面離開視線后,就會被消除,釋放其資源;而在頁面需要顯示時,生成新的頁面(就像 ListView 的實現一樣)。這么實現的好處就是當擁有大量的頁面時,不必在內存中占用大量的內存。

解決方案:

不用 FragmentPagerAdapter,而改用 FragmentStatePagerAdapter,并且重載 **getItemPosition() **并返回 POSITION_NONE,以觸發銷毀對象以及重建對象。從上面的分析中看,后者給出的建議確實可以達到調用 notifyDataSetChanged() 后,Fragment 被以新的參數重新建立的效果。

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+"");
                    //有多少個標題就有多少個碎片,動態添加
                    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() {
            }
        });


    }

實現的效果:

demo.gif

填充測試數據后的效果:

最終效果.gif

如果代碼中有什么問題,也歡迎大家評判指出!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容