Android FragmentPagerAdapter數據刷新notifyDataSetChanged沒效果研究

android3.0之後提出fragment概念正逐漸取代tabhost的地位,support-v4包也提供了很好使用的viewpager類。不多說。瞭解過fragment之後你會發現比tabhost好用許多,並且viewpager也支持fragment的嵌入,這使得項目的模塊化耦合度大大降低,項目中使用ViewPager+Fragment實現tab分頁+子tab頁內容滑動效果
效果圖如下:
Android <wbr>FragmentPagerAdapter數據刷新notifyDataSetChanged沒效果研究
點擊個個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數據刷新。
貼出我自己的代碼供參考:
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();
    }
}


發佈了65 篇原創文章 · 獲贊 26 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章