調用 FragmentPagerAdapter.notifyDataSetChanged() 並不能更新其 Fragment之我的解決方法

  private class ViewPagerAdapter extends FragmentPagerAdapter {
     FragmentManager mFragmentManager;
     FragmentTransaction mCurTransaction;
        public ViewPagerAdapter(FragmentManager fragmentManager) {
         super(fragmentManager);
         this.mFragmentManager = fragmentManager;
        }


        @Override
        public Fragment getItem(int position) {
         final String mimeType = mSortedActionMimeTypes.get(position);
         Log.d("lyl", "getItem-->mimeType: " + mimeType + " position: " + position);
            QuickContactListFragment fragment = new QuickContactListFragment(mimeType);
            return fragment;
        }
        
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
         removeFragment(container,position);
        
         QuickContactListFragment fragment =
         (QuickContactListFragment) super.instantiateItem(container,position);
         final String mimeType = mSortedActionMimeTypes.get(position);
            final List<Action> actions = mActions.get(mimeType);
            Log.d("lyl", "instantiateItem-->mimeType: " + mimeType + " position: " + position
             + " container.id: " + container.getId());
            Log.d("lyl", "actions: " + actions);
            fragment.setActions(actions);
         return fragment;
        }
        
        private void removeFragment(ViewGroup container, int position){
         if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
         String name = getFragmentName(container.getId(), position);
         Fragment fragment = mFragmentManager.findFragmentByTag(name);
         mCurTransaction.remove(fragment);
         mCurTransaction.commit();
         mCurTransaction = null;
         mFragmentManager.executePendingTransactions();
        }
        
    private String getFragmentName(int viewId, int index) {
     return "android:switcher:" + viewId + ":" + index;
    }
        
        @Override
        public int getCount() {
            return mSortedActionMimeTypes.size();
        }


        @Override
        public int getItemPosition(Object object) {
            final QuickContactListFragment fragment = (QuickContactListFragment) object;
            final String mimeType = fragment.getMimeType();
            for (int i = 0; i < mSortedActionMimeTypes.size(); i++) {
                if (mimeType.equals(mSortedActionMimeTypes.get(i))) {
                    return i;
                }
            }
            return PagerAdapter.POSITION_NONE;
        }

    }

貼出源碼FragmentPagerAdapter中關於instantiateItem方法的機制

 @Override
     public Object instantiateItem(View containerint position) {
         if (mCurTransaction == null) {
             mCurTransaction = mFragmentManager.beginTransaction();
         }
         // 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));
         }
         if (fragment != mCurrentPrimaryItem) {
             fragment.setMenuVisibility(false);
         }
         return fragment;
     }

在繼承fragmentpagerAdapter的類中,重載instantiateItem後,首先清除掉緩存內的fragment,這樣保證了調用父類的instantiateItem後,會每次從geiItem()裏獲得最新的fragment.就解決了使用的是緩存內的fragment,而數據卻不是最新的問題。



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