Quitar dinámicamente un elemento de un ViewPager con FragmentStatePagerAdapter
Hay bastantes discusiones alrededor de este tema
- ViewPager PagerAdapter no actualizar la vista
- Actualizar ViewPager dinámicamente?
- Eliminación de fragmentos de FragmentStatePagerAdapter
He intentado varias soluciones (incluyendo la invalidación con POSITION_NONE
). Pero todavía no sé cómo quitar un artículo correctamente.
- Viewpager en el fragmento no se muestra (restaurado) cuando vuelve de otro fragmento
- Viewpager vertical en la más reciente biblioteca de soporte técnico de Android da errores
- FragmentStatePagerAdapter fuga de memoria (fragmentos anidados con viewpager)
- Listview no actualizar en fragmento con las pestañas viewpager
- Cambiar el color de desplazamiento excesivo de ViewPager
Lo que ocurre es
- O bien obtengo una página en blanco (lo que significa que el fragmento se destruye, pero el
instantiateItem
no fue llamado para un reemplazo) - O la cosa entera se bloquea probablemente porque la manera que el androide maneja las instancias del fragmento no coincide con cómo las guardo en mi
arraylist/sparsearray
Aquí está mi adaptador
private class DatePickerPagerAdapter extends FragmentStatePagerAdapter { ArrayList<Fragment> registeredFragments = new ArrayList<Fragment>(); public DatePickerPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return CreateWishFormDatePaginationFragment.newInstance(position); } @Override public int getItemPosition(Object object){ //doesnt change much.. return PagerAdapter.POSITION_NONE; } @Override public int getCount() { return iPageCount; } @Override public Object instantiateItem(ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); registeredFragments.add(position, fragment); return fragment; } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, registeredFragments.get(position)); } public void removePage(ViewGroup pager, int position) { destroyItem(pager, position, null); registeredFragments.remove(position); iPageCount--; pagerIndicator.notifyDataSetChanged(); pagerAdapter.notifyDataSetChanged(); } public void addPage() { iPageCount++; pagerIndicator.notifyDataSetChanged(); pagerAdapter.notifyDataSetChanged(); } }
Estoy utilizando un paginador de vista con ViewPagerIndicator y quiero ser capaz de eliminar una página entre, por ejemplo.
Por lo tanto sigue siendo la pregunta, ¿cuál es la manera correcta de manejar la adición y la eliminación de fragmentos en un ViewPager?
¡Gracias!
- Añadir / eliminar páginas a ViewPager dinámicamente
- RecyclerView + ViewPager NullPointerException en 'boolean android.support.v7.widget.RecyclerView $ LayoutManager.canScrollHorizontally ()'
- Cómo controlar páginas de páginas de vista desde otra página
- Pager centrado de la visión con la previsualización siguiente y anterior y pagetransformer
- GetSupportFragmentManager no compila en DialogFragment
- Android añadió el indicador de círculo a viewpager
- ¿Ciclo de vida de un ViewPager y BackStack reemplazados?
- FragmentPagerAdapter Deslizar para mostrar ListView 1/3 Anchura de la pantalla
Si desea eliminar elementos de un ViewPager
, este código siguiente probablemente no tenga sentido:
@Override public Fragment getItem(int position) { return CreateWishFormDatePaginationFragment.newInstance(position); }
Esencialmente, lo que el código anterior significa es que se crea un Fragment
basado en la position
. Por lo tanto, independientemente de la página que elimine, el rango de la posición cambiará de [0, iPageCount
) a [0, iPageCount-1
) , lo que indica que siempre se deshará de la última.
Lo que usted necesita es más o menos lo siguiente:
public class DatePickerPagerAdapter extends FragmentStatePagerAdapter { private ArrayList<Integer> page_indexes; public DatePickerPagerAdapter(FragmentManager fm) { super(fm); page_indexes = new ArrayList<>(); for (int i = 0; i < 10; i++) { page_indexes.add(new Integer(i)); } } @Override public int getCount() { return page_indexes.size(); } @Override public Fragment getItem(int position) { Integer index = page_indexes.get(position); return CreateWishFormDatePaginationFragment.newInstance(index.intValue()); } // This is called when notifyDataSetChanged() is called @Override public int getItemPosition(Object object) { // refresh all fragments when data set changed return PagerAdapter.POSITION_NONE; } // Delete a page at a `position` public void deletePage(int position) { // Remove the corresponding item in the data set page_indexes.remove(position); // Notify the adapter that the data set is changed notifyDataSetChanged(); } }
Consulte este ejemplo completo para obtener más detalles acerca de cómo quitar el elemento de FragmentStatePagerAdapter .
- ¿Cambiar el kerning de texto o el espaciado en TextView?
- Cambiar filtro AutoCompleteTextView de "startsWith" a "Contains"?