2013-05-15 16 views
7

FragmentStatePagerAdapterを使用してフラグメント(オブジェクトを表すarrayListOfObjects)を取り込むViewPagerがあります。 すべてがうまく機能:FragmentStatePagerAdapterによって作成されたViewPagerからすべてのフラグメントを削除します。

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

フラグメントアダプタがFragmentStatePagerAdapterを拡張します。

主なアクティビティからは、テーマのついたアクティビティを起動しました。ここで、ユーザは、第1のアクティビティによって渡されたオブジェクトのアライリストを変更する新しいオブジェクトを作成する新しいお気に入りの場所を追加することができる。 これはダイアログアクティビティを開始するためのコードです。すべて正常に動作します。

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

floatingアクティビティは、オブジェクトをarrayListOfObjectsに追加します。

プライマリアクティビティのonActivityResultで、私が受け取ったarraListOfObjectsを、送信したものと比較します。異なる場合、私はviewPagerの内容を完全に削除し、新しいarrayListOfObjectsで再作成したいと思います。これはonActivityResultsです:

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

}

問題:私はstartActivityForを発射する前に しかし、新しいArrayListOfObjectsが古いものと一緒に追加され

 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コードです結果。

viewPagerで古いコンテンツを忘れるようにするにはどうすればよいですか?基本的に私のfragmentStateAdapterを使用して、このnewArrayListofObjectsでviewPagerアダプタをリセットしますか?

答えて

0

私がする必要があったのは、FragmentStatePagerAdapterを再割り当てすることでした。

これは、onActivityResultで見られるように、適切な動作をマスクしていたが、私のviewPagerページインジケータはページを増分していた。私がviewPagerで2ページを持っていて、その子のactvityを呼び出すと、arrayListOfObjectsに1つのオブジェクトが追加されます。 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();  

EDIT:それを削除するには、より正確かもしれあなたのフラグメントを使用して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 EDITセクション –

+0

を参照してください。fragmentManager.getFragments()はパブリック関数ではありません:https://stackoverflow.com/questions/42572249/getsupportfragmentmanager-getfragments-shows-a-compile-time-error –

関連する問題