No puedo reutilizar fragmentos en FragmentPagerAdapter .. Usando el método destroyItem (), está eliminando el fragmento pero todavía no se llama getItem (). Solo hay 2-3 imágenes, así que estoy usando FragmentPagerAdapter en lugar de FragmentStatePagerAdapter ..
public class ExamplePagerAdapter extends FragmentPagerAdapter {
ArrayList < String > urls;
int size = 0;
public ExamplePagerAdapter(FragmentManager fm, ArrayList < String > res) {
super(fm);
urls = res;
size = urls.size();
}
@Override
public int getCount() {
if (urls == null) {
return 0;
} else {
return size;
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new FloorPlanFragment();
Bundle b = new Bundle();
b.putInt("p", position);
b.putString("image", urls.get(position));
Log.i("image", "" + urls.get(position));
fragment.setArguments(b);
return fragment;
}
}
Y en FragmentActivity,
pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2));

destroyItem()? Eso no es necesario.Respuestas:
BESO Respuesta:
Uso simple FragmentStatePagerAdapter en lugar de FragmentPagerAdapter .
Obtuve la respuesta. En primer lugar, pensé en eliminar esta pregunta, ya que estoy cometiendo un error muy tonto, pero esta respuesta ayudará a alguien que se enfrenta al mismo problema que en lugar de
FragmentPagerAdapterusarFragmentStatePagerAdapter.Como @BlackHatSamurai mencionó en el comentario:
fuente
El uso de
FragmentStatePagerAdapterno solucionó por completo mi problema, que era un problema similar en el queonCreateViewno se solicitaban fragmentos secundarios en el visor de vistas. En realidad, estoy anidando miFragmentPagerAdapterinterior de otro,Fragmentpor lo tanto,FragmentManagerse compartió en todos ellos y, por lo tanto, conservé instancias de los viejos fragmentos. La solución consistía en alimentar una instancia delgetChildFragmentManageral constructor delFragmentPagerAdapteren mi fragmento de host. Algo como...El
getChildFragmentManager()método es accesible a través de un fragmento y esto funcionó para mí porque devuelve un privadoFragmentManagerpara ese fragmento específicamente para situaciones en las que se necesitan fragmentos de anidación. ¡Espero que esto ayude a alguien que pueda estar teniendo el mismo problema que yo!getChildFragmentManager()tenga en cuenta que usar su versión mínima de API debe ser al menos17 (4.2), por lo que esto puede poner una llave en sus engranajes. Por supuesto, si está utilizando fragmentos de la biblioteca de soporte v4, debería estar bien.fuente
Anular
long getItemId (int position)FragmentPagerAdapteralmacena en caché los fragmentos que crea usandogetItem. Estaba enfrentando el mismo problema, incluso después de quenotifyDataSetChanged()getItemno se llamaba.Esto es en realidad una característica y no un error. Debe anular
getItemIdpara poder reutilizar correctamente sus fragmentos. Como está eliminando fragmentos, sus posiciones están cambiando. Como se menciona en los documentos:Simplemente proporcione una identificación única para cada fragmento y ya está.
Utilizando una
FragementStatePagerAdaptero regresarPOSITION_NONEen elint getItemPosition (Object object)que está mal. No obtendrá ningún almacenamiento en caché.fuente
getItemIdY ajustargetItemPositionpara devolverPOSITION_NONESI el fragmento debe eliminarse. Tengo una bandera de enumeración para eso. Después de esogetItemserá llamado.Hice lo que @kanika y @ Jraco11 habían publicado, pero aún tenía el problema.
Entonces, después de muchos cambios, encontré uno que funcionó para mí y se agregó a mi FragmentPagerAdapter el siguiente código:
De acuerdo con lo que leí, getItemPosition se usa para notificar al ViewPager si actualizar o no un elemento, y para evitar actualizaciones si los elementos en las posiciones visibles no han cambiado.
fuente
Hay dos escenarios diferentes: 1.) Tiene el mismo diseño para cada buscapersonas: en ese caso, será mejor si extiende su adaptador personalizado con PagerAdapter y devuelve un diseño único.
2.) Tiene un diseño diferente para cada buscapersonas: en ese caso, será mejor si extiende su adaptador personalizado con FragmentStatePagerAdapter y devuelve diferentes fragmentos para cada buscapersonas.
fuente
El método
getItem()se utiliza solo para crear nuevos elementos. Una vez que crearon, este método no se llamará. Si necesita obtener un artículo que es moneda en uso por el adaptador, use este método:fuente
Descubrí que configurar un oyente en el diseño de tabulación impidió que se llamara a esto, probablemente porque solo tienen espacio para un oyente en
tabLayout.setOnTabSelectedListenerlugar de una matriz de oyentes.fuente