下圖是要實(shí)現(xiàn)的效果:
結(jié)果我實(shí)現(xiàn)的結(jié)果:
切換上面的按鈕礁哄,我希望能夠通過(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)的效果:
填充測(cè)試數(shù)據(jù)后的效果:
如果代碼中有什么問(wèn)題,也歡迎大家評(píng)判指出抖所!