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!
- Peut-être que ce lien peut vous aider : stackoverflow.com/questions/10396321/...
Vous devez vous connecter pour publier un commentaire.
Le problème est la
FragmentStatePagerAdapter,
qui récupère le passé-de-vue des fragments.
Même si vous créez un nouveau.
Essayez d'utiliser l'
FragmentPagerAdapter
au lieu de cela, ce qui rend un nouveau départ sur de son instanciation.
J'ai eu le même problème, la seule solution que j'ai trouvé était la valeur de la carte à nouveau après le retrait du fragment comme ceci :
MISE À JOUR : VOUS N'AVEZ PAS BESOIN DE L'ADAPTATEUR. Voici quelques méthodes de ma PagerAdapter, vous avez besoin probablement de faire quelques modifications afin de l'utiliser comme FragmentPagerAdapter
Pour supprimer les points de vue :
Remplacer getItemPosition(Objet pObject) :
Actualiser tous les points de vue :