Android FragmentPagerAdapter資料重新整理notifyDataSetChanged沒效果研究
阿新 • • 發佈:2019-01-24
android3.0之後提出fragment概念正逐漸取代tabhost的地位,support-v4包也提供了很好使用的viewpager類。不多說。瞭解過fragment之後你會發現比tabhost好用許多,並且viewpager也支援fragment的嵌入,這使得專案的模組化耦合度大大降低,專案中使用ViewPager+Fragment實現tab分頁+子tab頁內容滑動效果
效果圖如下:
點選個個tab1更換pageadapter的值實現資料的更新。通過繼承fragmentpageadpater你會發現使用起來很方便。具體fragmentpageradapter怎麼用?網上很多看客可以去搜一下。 下面我就要說到本文的核心當你更新裡fragment List集合後呼叫fragmentpageadpater的notifyDataSetChanged方法時發現數據根本就沒有重新整理。網路上會提到pageadapter的重新整理方案如下程式碼: 複寫pageradapter的getItemPosition方法設定tag為POSITION_NONE意思是沒有找到child要求重新載入。
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
結果你發現是重新整理了一下但內容還是原始的資料。通過對fragmentpageadapter的原始碼檢視你會在instantiateItem方法裡面發現這一段
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), position);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + position + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), position));
}
原來他會先去FragmentManager裡面去查詢有沒有相關的fragment如果有就直接使用如果沒有才會觸發fragmentpageadapter的getItem方法獲取一個fragment。所以你更新的fragmentList集合是沒有作用的,還要清除FragmentManager裡面快取的fragment。解決辦法:在繼承的fragmentpageadapter類裡面新增這麼一個方法
public void setFragments(ArrayList fragments) {
if(this.fragments != null){
FragmentTransaction ft = fm.beginTransaction();
for(Fragment f:this.fragments){
ft.remove(f);
}
ft.commit();
ft=null;
fm.executePendingTransactions();
}
this.fragments = fragments;
notifyDataSetChanged();
}
就能完美的解決fragmentpageadapter資料重新整理。
貼出我自己的程式碼供參考:
點選個個tab1更換pageadapter的值實現資料的更新。通過繼承fragmentpageadpater你會發現使用起來很方便。具體fragmentpageradapter怎麼用?網上很多看客可以去搜一下。 下面我就要說到本文的核心當你更新裡fragment List集合後呼叫fragmentpageadpater的notifyDataSetChanged方法時發現數據根本就沒有重新整理。網路上會提到pageadapter的重新整理方案如下程式碼: 複寫pageradapter的getItemPosition方法設定tag為POSITION_NONE意思是沒有找到child要求重新載入。
public class KindNameAdapter extends FragmentPagerAdapter { private Context context; private List<KindGoodsCgChildBean> data;//分類頁的type資料 private List<CategoryBean> categoryBeanList;//關注頁面的type資料deng private List<Fragment> fragmentList; private FragmentManager fm; public KindNameAdapter(FragmentManager fm, Context context, List<KindGoodsCgChildBean> data, List<Fragment> fragmentList) { super(fm); this.context = context; this.data = data; this.fragmentList = fragmentList; this.fm = fm; } public KindNameAdapter(FragmentManager fm, List<CategoryBean> categoryBeanList, List<Fragment> fragmentList) { super(fm); this.categoryBeanList = categoryBeanList; this.fragmentList = fragmentList; this.fm = fm; } @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } @Override public int getCount() { if (data == null) { return categoryBeanList.size(); } else { return data.size(); } } @Override public CharSequence getPageTitle(int position) { if (data == null) { return categoryBeanList.get(position).productCategoryName; } else { return data.get(position).categoryName; } } public void setFragmentsAndData(List<Fragment> fragmentList, List<KindGoodsCgChildBean> data) { if(this.fragmentList != null){ FragmentTransaction ft = fm.beginTransaction(); for(Fragment f:this.fragmentList){ ft.remove(f); } ft.commit(); ft=null; fm.executePendingTransactions(); } this.fragmentList = fragmentList; this.data = data; notifyDataSetChanged(); } }