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?
- Tab Título en tablayout + view pager No se muestra en Android 5.0 y superior después de agregar CoordinatorLayout
- Actualizar imágenes en FragmentStatePagerAdapter al reanudar la actividad
- NestedScrollView dentro de ViewPager dentro de NestedScrollView: NestedScrollView Inferior que no se desplaza
- ViewPager como una cola circular / envoltura
- Detectar el cambio de la pestaña ViewPager dentro del fragmento
- PagerTabStrip tabs alineación a la izquierda
- FragmentStatePageAdapter duplica elementos del menú ActionBar
- Cómo actualizar la vista actual en ViewPager
- Android, Cómo mezclar ActionBar.Tab + Ver Pager + ListFragment
- Pestañas de la barra de acciones anidadas (con ViewPager)
- Cómo acceder al valor de edittext dentro de fragmento que está en un viewpager
- Creación de un diseño de cuadro de mandos como fragmento mediante programación
- Añadiendo drawable a CirclePageIndicator
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);
- Consideraciones sobre el diseño de Android: AsyncTask vs Service (IntentService?)
- Ancho de diálogo de Android