1. 程式人生 > >Android FragmentPagerAdapter資料重新整理notifyDataSetChanged沒效果研究

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();
    }
}