Impossible de supprimer le fragment de ViewPager, pourquoi?

Quelque chose doit m'échapper, mais je ne peut pas retirer un fragment de mon ViewPager. - Je stocker les titres de page dans un ArrayList:

Partie de ViewPagerActivity.java (qui est un FragmentActivity, l'activité principale):

public static ArrayList<String> mEntries = new ArrayList<String>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.main );
    context=this;

    mEntries.add("   111");
    mEntries.add("   222");
    mEntries.add("   333");
    mEntries.add("   444");
    mEntries.add("   555");
    mEntries.add("   666");

    List<String> fragments = new Vector<String>();

    fragments.add(111.class.getName());
    fragments.add(222.class.getName());
    fragments.add(333.class.getName());
    fragments.add(444.class.getName());
    fragments.add(555.class.getName());
    fragments.add(666.class.getName());

    this.mPagerAdapter = new PagerAdapter1(super.getSupportFragmentManager(), fragments);
    pager = (ViewPager)super.findViewById(R.id.viewpager);
    pager.setAdapter(this.mPagerAdapter);
    //...

J'ai un fragment (111) où je voudrais enlever le 555 fragment en cliquant sur un bouton dans 111. (Puisqu'il démarre avec 0, 555 est le 4e fragment).

Partie de fragment111.java (qui est un Fragment):

     button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
           ViewPagerActivity.mEntries.remove(5);
     ViewPagerActivity.mPagerAdapter.removeX(5);
    ViewPagerActivity.mPagerAdapter.removeX2(5);
    ViewPagerActivity.pager.setAdapter( ViewPagerActivity.mPagerAdapter);
    ViewPagerActivity.pager.getAdapter().notifyDataSetChanged();    
   }
        });

J'ai le POSITION_NONE chose que certaines personnes manquent en substituant les getItemPosition() méthode.

mon adaptateur classe:

  public class PagerAdapter1 extends FragmentStatePagerAdapter {
private List<String> fragments;
private static final String TAG = "FragmentPagerAdapter";
private static final boolean DEBUG = true;
private Fragment mCurrentPrimaryItem = null;
private final FragmentManager mFragmentManager;
private FragmentTransaction mCurTransaction = null;
/**
* @param fm
* @param fragments2
*/
public PagerAdapter1(FragmentManager fm, List<String> fragments2) {
super(fm);
mFragmentManager=fm;
this.fragments = fragments2;
}
/* (non-Javadoc)
* @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
*/
@Override
public Fragment getItem(int position) {
//return this.fragments.get(position);
return Fragment.instantiate(ViewPagerActivity.context, fragments.get(position));
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#getCount()
*/
@Override
public int getCount() {
return this.fragments.size();
}
/**
* Return the Fragment associated with a specified position.
*/
@Override
public void startUpdate(ViewGroup container) {
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
final long itemId = getItemId(position);
//Do we already have this fragment?
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
+ " v=" + ((Fragment)object).getView());
mCurTransaction.detach((Fragment)object);
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment)object;
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
mCurrentPrimaryItem.setMenuVisibility(false);
mCurrentPrimaryItem.setUserVisibleHint(false);
}
if (fragment != null) {
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
}
mCurrentPrimaryItem = fragment;
}
}
@Override
public void finishUpdate(ViewGroup container) {
if (mCurTransaction != null) {
mCurTransaction.commitAllowingStateLoss();
mCurTransaction = null;
mFragmentManager.executePendingTransactions();
}
}
@Override
public boolean isViewFromObject(View view, Object object) {
return ((Fragment)object).getView() == view;
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}
/**
* Return a unique identifier for the item at the given position.
*
* <p>The default implementation returns the given position.
* Subclasses should override this method if the positions of items can change.</p>
*
* @param position Position within this adapter
* @return Unique identifier for the item at position
*/
public long getItemId(int position) {
return position;
}
private static String makeFragmentName(int viewId, long id) {
return "android:switcher:" + viewId + ":" + id;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
public void removeX(int position){
fragments.remove(5);
}        
public void removeX2(int position){
Fragment ff =  getItem(position);
mFragmentManager.beginTransaction().remove(ff).commit();
notifyDataSetChanged();
}
}

Je suis en utilisant FragmentStatePagerAdapter et la notifyDataSetChanged() fonctionne bien (je l'ai mise à jour de l'état d'un CheckBox et je vois qu'il fonctionne). Comment puis-je supprimer ce fragment de la ViewPager?

Merci d'avance!

InformationsquelleAutor Jani Bela | 2013-03-04