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
FragmentPagerAdapter
usarFragmentStatePagerAdapter
.Como @BlackHatSamurai mencionó en el comentario:
fuente
El uso de
FragmentStatePagerAdapter
no solucionó por completo mi problema, que era un problema similar en el queonCreateView
no se solicitaban fragmentos secundarios en el visor de vistas. En realidad, estoy anidando miFragmentPagerAdapter
interior de otro,Fragment
por lo tanto,FragmentManager
se compartió en todos ellos y, por lo tanto, conservé instancias de los viejos fragmentos. La solución consistía en alimentar una instancia delgetChildFragmentManager
al constructor delFragmentPagerAdapter
en 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 privadoFragmentManager
para 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)
FragmentPagerAdapter
almacena en caché los fragmentos que crea usandogetItem
. Estaba enfrentando el mismo problema, incluso después de quenotifyDataSetChanged()
getItem
no se llamaba.Esto es en realidad una característica y no un error. Debe anular
getItemId
para 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
FragementStatePagerAdapter
o regresarPOSITION_NONE
en elint getItemPosition (Object object)
que está mal. No obtendrá ningún almacenamiento en caché.fuente
getItemId
Y ajustargetItemPosition
para devolverPOSITION_NONE
SI el fragmento debe eliminarse. Tengo una bandera de enumeración para eso. Después de esogetItem
será 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.setOnTabSelectedListener
lugar de una matriz de oyentes.fuente