下圖是要實現的效果:
結果我實現的結果:
切換上面的按鈕,我希望能夠通過調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() {
}
});
}
實現的效果:
填充測試數據后的效果:
如果代碼中有什么問題,也歡迎大家評判指出!