2013-05-15 35 views
7

我有一個ViewPager,我使用FragmentStatePagerAdapter填充了片段(表示來自arrayListOfObjects的對象)。 一切運作良好:從FragmentStatePagerAdapter填充的ViewPager中刪除所有片段

  mMyFragmentPagerAdapter = new fragmentAdapter(getSupportFragmentManager(),orientation 
      ,rePopulatedfireInfoList); 
     mPager = (ViewPager)findViewById(R.id.fireInfoFragment_container); 
     initButton(); 
     setTab(); 
     mPager.setAdapter(mMyFragmentPagerAdapter); 

片段適配器擴展FragmentStatePagerAdapter。

從主要活動我啓動對話主題活動;用戶可以添加一個新的最愛位置,創建一個新的對象,改變主要活動傳遞的對象的數組列表。 這是啓動對話框活動的代碼;所有工作正常:

 Intent locationIntent = new Intent(afisController.this, locationActivity.class); 
    locationIntent.putExtra("firesList", new fireInfoListWrapper(arrayListOfObjects)); 
    startActivityForResult(locationIntent,1); 

浮動活動將對象添加到arrayListOfObjects。

在主要活動的onActivityResult上,我比較了我收到的arraListOfObjects和我發送的arraListOfObjects;如果不同,我想完全刪除viewPager的內容並用新的arrayListOfObjects重新創建它。這是onActivityResults:

 protected void onActivityResult(int requestCode, int resultCode, 
      Intent data) { 
Toast.makeText(this, "Activity Results fired..." , 1500).show(); 
      if ((resultCode == 0) && (data != null)) { 
       Log.i("onActvityResult", "Inside resultCode check"); 
       Bundle b = data.getExtras(); 
       if(b != null){ 
        Log.i("onActvityResult", "not null"); 
        returnedFireInfoList = (ArrayList<fireInfo>) data.getSerializableExtra("firesListResult"); 
        Log.i("onActvityResult", "results Size: "+returnedFireInfoList.size()); 
        if(returnedFireInfoList.size()>0){ 
         Log.i("onActvityResult", "locationName: "+returnedFireInfoList.get(0).getLocationName()); 
         //compare returnedFireInfoList and rePopulatedfireInfoList, if different; 
         //add difference to rePopulatedfireInfoList and write back to file. 
         updateFireInfos(returnedFireInfoList, rePopulatedfireInfoList); 
     if(returnedFireInfoList.size()!=rePopulatedfireInfoList.size()){ 
mMyFragmentPagerAdapter1 = new fragmentAdapter(getSupportFragmentManager(),orientation 
        ,returnedFireInfoList); 
      mPager = (ViewPager)findViewById(R.id.fireInfoFragment_container); 
      Log.i("updateFireInfos", "fragmentsCount is"+mPager.getCurrentItem()); 
      fireInfoFragment fragment = 
         (fireInfoFragment) getSupportFragmentManager().findFragmentById(R.id.fireInfoFragment_container); 
//This is where the problem is, I don't want to remember what was already on the viewPager //called mPager before. 
      // mPager.removeAllViews(); 
      //mPager.setAdapter(null); 
      mMyFragmentPagerAdapter1.notifyDataSetChanged();    
      mPager.setAdapter(mMyFragmentPagerAdapter1);    mMyFragmentPagerAdapter1.notifyDataSetChanged();      
        }     
       } 
      }   

這是fragmentStateAdapter代碼:

public class fragmentAdapter extends FragmentStatePagerAdapter { 

private FragmentManager fragmentManager; 
private FragmentTransaction mCurTransaction = null; 
private ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>(); 
private ArrayList<Fragment> mFragments = new ArrayList<Fragment>(); 
private Fragment mCurrentPrimaryItem = null; 



public void restoreState(Parcelable state, ClassLoader loader) { 
    //Need to only delete info from marked fragments (theoned that are stored on orientationchange 
    //Currently redoing the entire call; resulting in delay due to server call 
    //if(isLastOrientationPortrait != isPortrait){ 
    if(state != null){ 
     Bundle bundle1 = (Bundle) state; 
     bundle1.setClassLoader(loader); 
     Iterable<String> keys = bundle1.keySet(); 
     Log.i("restoreState", "containsKey FragmentStatePagerAdapter: "+keys); 
     //android.support.v4.app.FragmentManager fragmentManager= fragmentAdapter.this.fragmentManager; 
     android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     //if (fragmentTransaction == null) { 
     // Log.i("restoreState", "fragmentTransactionTest"); 

      fragmentTransaction = fragmentManager.beginTransaction(); 
     // } 
     for (String key : keys) { 
      if (key.startsWith("f")) { 
       Fragment f = fragmentManager.getFragment(bundle1, 
         key); 
       fragmentTransaction.remove(f); 
       fragmentTransaction.commit(); 
      } 
      } 
     } 
    //}  
    } 


@Override 
public int getItemPosition(Object object) { 
    // TODO Auto-generated method stub 
    //return super.getItemPosition(object); 
    return fragmentAdapter.POSITION_NONE; 
} 


public fragmentAdapter(android.support.v4.app.FragmentManager fragmentManager,String orientation, 
     ArrayList<fireInfo> fireInfoList) { 
    super(fragmentManager); 
    this.orientation = orientation; 
    this.fireInfoList = fireInfoList; 
    this.numItems = fireInfoList.size(); 
    this.fragmentManager=fragmentManager; 
} 
ArrayList<fireInfo> fireInfoList; 
String orientation; 
int numItems; 


@Override 
public int getCount() { 
    Log.i("numItems", "is: "+fireInfoList.size()); 
    return numItems; 
} 

@Override 
public Fragment getItem(int arg0) { 
    Log.i("fragmentAdapterIndex", "is: "+arg0); 
    return fireInfoFragment.newInstance(orientation, fireInfoList.get(arg0)); 
}  

}

問題: 但新ArrayListOfObjects添加旁邊的舊之前我開的startActivityFor結果。

如何強制viewPager忘記舊內容?基本上用這個newArrayListofObjects使用我的fragmentStateAdapter重置viewPager適配器?

回答

0

我需要做的就是重新分配FragmentStatePagerAdapter。

在onActivityResult中可以看到這一點,但是掩蓋正確行爲的是我的viewPager頁面指示符,它正在增加頁面,例如如果在viewPager上有2個頁面並調用將在arrayListOfObjects上添加一個對象的子活動; viewPager頁面指示器將顯示我現在有2加3頁(5)。

我不得不重置onActivityResult中的viewPage指示符,讓它通過浮動活動返回的新的arrayListOfObjects來確定它。

43

我想問題在於,舊的碎片仍然駐留在您用於您的適配器的FragmentManager中。如果是這種情況,您只需從片段管理器中刪除所有舊片段。

所以基本上只是在你的適配器的構造函數執行以下代碼:

public fragmentAdapter(FragmentManager fragmentManager, String orientation, ArrayList<fireInfo> list) { 
    super(fragmentManager); 
    if (fragmentManager.getFragments() != null) { 
     fragmentManager.getFragments().clear(); 
    } 
    //... your other code here 
} 

這行代碼是不必要的:

mMyFragmentPagerAdapter1.notifyDataSetChanged();  

編輯:這可能是更正確的去除您使用的片段FragmentTransaction

List<Fragment> fragments = fragmentManager.getFragments(); 
    if (fragments != null) { 
     FragmentTransaction ft = fragmentManager.beginTransaction(); 
     for (Fragment f : fragments) { 
      //You can perform additional check to remove some (not all) fragments: 
      if (f instanceof AddedByCurrentPagerAdapterFragment) { 
       ft.remove(f); 
      } 
     } 
     ft.commitAllowingStateLoss(); 
    } 

FragmentTransaction需要一定的時間(異步)執行。

+1

當您想要保留由同一個FragmentManager管理的其他片段但只想刪除由此FragmentPagerAdapter創建的片段時會發生什麼? – mmathieum

+0

@mmathieum請參閱編輯部分 –

+0

fragmentManager.getFragments()不是一個公共函數:https://stackoverflow.com/questions/42572249/getsupportfragmentmanager-getfragments-shows-a-compile-time-error –