Añadir / eliminar páginas a ViewPager dinámicamente

Me gustaría añadir o eliminar páginas de mi paginador de vista dinámicamente. ¿Es eso posible?

Sí, ya que ViewPager obtiene las Vistas secundarias de un PagerAdapter, puede agregar páginas nuevas / eliminar páginas en eso y llamar a .notifyDataSetChanged () para volver a cargarlo.

Sí, el código debería ser así:

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

Pero hay un error. Si el elemento actual es 0, y para eliminar la página 0, no actualizará la pantalla al instante, no he encontrado una solución para esto.

Sí. Puede agregar o eliminar vistas dinámicamente al PagerAdapter que las está suministrando al ViewPager y llamar a notifyDataSetChanged() desde el PagerAdapter para alertar al ViewPager afectado acerca de los cambios. Sin embargo, al hacerlo, debe reemplazar getItemPosition(Object) del PagerAdapter, que indica si los elementos que están mostrando actualmente han cambiado de posición. De forma predeterminada, esta función se establece en POSITION_UNCHANGED , por lo que el ViewPager no se actualizará inmediatamente si no se anula este método. Por ejemplo,

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

Aunque, si simplemente desea agregar o quitar la vista temporalmente de la pantalla, pero no del conjunto de datos del PagerAdapter, intente usar setPrimaryItem(ViewGroup, int, Object) para ir a una vista particular en los datos del destroyItem(ViewGroup, int, Object) y destroyItem(ViewGroup, int, Object) para eliminar una vista de la pantalla.

Aquí hay una solución alternativa a esta pregunta. Mi adaptador:

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

Código para eliminar y agregar dinámicamente

 //remove the pages. basically call to method removeAllViews from ViewPager pagerAdapter.removePages(); pagerAdapter.addPage(pass your fragment); 

Después del consejo de Peri Hartman , comenzó a trabajar después de que fijara null al adaptador de ViewPager y pusiera el adaptador otra vez después de las vistas quitado. Antes de esto, la página 0 no muestra el contenido de la lista.

Estoy seguro que usted ha creado un adaptador extendiendo PageAdapter, así que hay un método:

  @Override public void destroyItem(View collection, int position, Object view) { ((ViewPager) collection).removeView((View) view); } 

Para un ejemplo detallado del mismo, basta con pasar por este ejemplo .

Primero: anule el método pagerAdapter "getItemPosition"

 @Override public int getItemPosition(Object object) { return POSITION_NONE; } } 

En segundo lugar: eliminar el enlace de datos con el adaptador.y llamar a adapter.notifydatachanged

 @Bind(R.id.pager) ViewPager pager; int pos = pager.getCurrentItem(); pager.removeViewAt(pos); 
  • ¿Cómo implemento el mecanismo de reciclado de la vista para PagerAdapter?
  • ¿Cómo mostrar sólo imágenes de memoria caché en ViewPager con Universal Image Loader Android?
  • Guardar el estado de WebView y restaurar en ANDROID
  • Vertical Ver animación de buscapersonas en android
  • ActionBarSherlock con ViewPager no llamando ViewPager fragmentos métodos de ciclo de vida al ir y volver de backstack
  • NoClassDefFoundError en DirectionalViewPager usando
  • Obtención del error "La actividad Java.lang.IllegalStateException se ha destruido" al utilizar pestañas con ViewPager
  • Cómo obtener la posición actual en FragmentPagerAdapter?
  • ViewPager of Fragment no muestra su contenido cuando el fragmento de raíz se reemplaza de nuevo
  • Uso de la animación en un ViewPager y setFillAfter
  • Ver Pager Crash Null Pointer Excepción debido a navegar de nuevo al fragmento antiguo - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.