Je voudrais ajouter ou supprimer des pages de mon pageur de vue dynamiquement. Est-ce possible?
Réponses
Trop de publicités?Oui. Vous pouvez ajouter ou supprimer des points de vue de manière dynamique à la PagerAdapter qui est de leur fournir les ViewPager et appelez - notifyDataSetChanged()
de la PagerAdapter pour alerter l'touchées ViewPager sur les changements. Toutefois, lorsque vous le faites, vous devez remplacer l' getItemPosition(Object)
de la PagerAdapter, qui leur dit que les articles qu'ils sont actuellement ont changé de position. Par défaut, cette fonction est activée ( POSITION_UNCHANGED
, de sorte que le ViewPager ne mettra pas à jour immédiatement si vous n'avez pas surcharger cette méthode. Par exemple,
public class mAdapter extends PagerAdapter {
List<View> mlist;
public void addView(View view, int index) {
mList.add(index, view);
notifyDataSetChanged();
}
public void removeView(int index) {
mList.remove(index);
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
if (mList.contains((View) object) {
return mList.indexOf((View) object);
} else {
return POSITION_NONE;
}
}
}
Bien que, si vous souhaitez simplement ajouter ou supprimer de la vue temporairement de l'affichage, mais pas à partir de l'ensemble de données de la PagerAdapter, essayez d'utiliser setPrimaryItem(ViewGroup, int, Object)
pour aller à un point de vue particulier dans le PagerAdapter les données et l' destroyItem(ViewGroup, int, Object)
pour la suppression d'une vue à partir de l'écran d'affichage.
Oui, le code devrait être comme ça:
public int addPage(View view, int position) {
if ((position >= 0) && (position < getSize())) {
myPagerAdapter.mListViews.add(position, view);
myPagerAdapter.notifyDataSetChanged();
return position;
} else {
return -1;
}
}
public View removePage(int position) {
if ((position < 0) || (position >= getSize()) || (getSize()<=1)) {
return null;
} else {
if (position == mPager.getCurrentItem()) {
if(position == (getSize()-1)) {
mPager.setCurrentItem(position-1);
} else if (position == 0){
mPager.setCurrentItem(1);
}
}
View tempView = myPagerAdapter.mListViews.remove(position);
myPagerAdapter.notifyDataSetChanged();
return tempView;
}
}
Mais il y a un bug. Si l'élément actuel est 0 et que vous souhaitez supprimer la page 0, l'écran ne sera pas actualisé instantanément. Je n'ai pas trouvé de solution à ce problème.
Voici une solution alternative à cette question. Mon adaptateur:
private class PagerAdapter extends FragmentPagerAdapter implements
ViewPager.OnPageChangeListener, TabListener {
private List<Fragment> mFragments = new ArrayList<Fragment>();
private ViewPager mPager;
private ActionBar mActionBar;
private Fragment mPrimaryItem;
public PagerAdapter(FragmentManager fm, ViewPager vp, ActionBar ab) {
super(fm);
mPager = vp;
mPager.setAdapter(this);
mPager.setOnPageChangeListener(this);
mActionBar = ab;
}
public void addTab(PartListFragment frag) {
mFragments.add(frag);
mActionBar.addTab(mActionBar.newTab().setTabListener(this).
setText(frag.getPartCategory()));
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
/** (non-Javadoc)
* @see android.support.v4.app.FragmentStatePagerAdapter#setPrimaryItem(android.view.ViewGroup, int, java.lang.Object)
*/
@Override
public void setPrimaryItem(ViewGroup container, int position,
Object object) {
super.setPrimaryItem(container, position, object);
mPrimaryItem = (Fragment) object;
}
/** (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#getItemPosition(java.lang.Object)
*/
@Override
public int getItemPosition(Object object) {
if (object == mPrimaryItem) {
return POSITION_UNCHANGED;
}
return POSITION_NONE;
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
mPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) { }
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) { }
@Override
public void onPageScrollStateChanged(int arg0) { }
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
/**
* This method removes the pages from ViewPager
*/
public void removePages() {
mActionBar.removeAllTabs();
//call to ViewPage to remove the pages
vp.removeAllViews();
mFragments.clear();
//make this to update the pager
vp.setAdapter(null);
vp.setAdapter(pagerAdapter);
}
}
Code à supprimer et à ajouter dynamiquement
//remove the pages. basically call to method removeAllViews from ViewPager
pagerAdapter.removePages();
pagerAdapter.addPage(pass your fragment);
Après les conseils de Peri Hartman , cela a commencé à fonctionner après avoir défini null
sur l’adaptateur ViewPager et mis de nouveau l’adaptateur une fois les vues supprimées. Avant cela, la page 0 ne montrait pas le contenu de sa liste.
Je suis sûr que vous avez créé un adaptateur en étendant PageAdapter. Il existe donc une méthode:
@Override
public void destroyItem(View collection, int position, Object view) {
((ViewPager) collection).removeView((View) view);
}
Pour un exemple détaillé, suivez cet exemple .