Refrescar vista de fragmentos mientras utiliza FragmentStatePagerAdapter

Parece que el problema de actualización se discute antes, pero ninguna de las soluciones funcionó para mí.

Lo que estoy tratando de hacer: Estoy utilizando FragmentStatePagerAdapter. Cada posición del adaptador contiene un fragmento que tiene un diseño lineal que tiene aspecto de ajedrez, con cada celda representada por un CheckedTextView.

Y un oyente que debe escuchar los clics y elimina la selección anterior en las celdas y hace la nueva selección.

Qué está funcionando: Cada fragmento se carga correctamente con todos los datos / estados por defecto (calculados mientras el fragmento se carga en una lista)

Cuando hago clic en una celda todos los estados de la lista de celdas guardadas se obtienen correctamente y puedo cambiar ver el cambio de estado en el código durante la depuración. Al mismo tiempo asigno un nuevo estado para el CheckedTextView que representa una celda. Esto se establece como:

CheckedTextView cellView = (CheckedTextView) GridRow.getChildAt(c); cellView.setSelected(false); cellView.setChecked(false); cellView.setTag(cellsChess.get(i).get(c)); 

El problema: aunque los valores se almacenan y asignan correctamente la vista no se puede actualizar los valores de las celdas de la vista no se actualizan.

Consejos que he probado que no funcionó: 1. Llame a adapter.notifyDataSetChanged: Puede ser llamado mientras se utiliza FragmentStatePagerAdapter sólo cuando hemos sobreescrito:

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

2. Añadiendo métodos de Overriden para DestroyItem y también agregando los fragmentos a un mapa en getItem:

Esto no es apropiado ya que estoy trabajando con FragmentStatePagerAdapter, por lo que todo el propósito de usar este pagerAdapter se habrá ido.

3. Invocación invalidate: Esto es inapropiado para este escenario, necesito actualizar en tiempo real.

4. Método setTag () en instantiateItem (): No creo que esto sea apropiado en esta situación.

Hilos de referencia: Actualizar imágenes en FragmentStatePagerAdapter al reanudar la actividad

ViewPager PagerAdapter no actualizar la vista

Actualizar ViewPager dinámicamente?

NotifyDataSetChanged no puede actualizar ListView

He tratado de exponer mi problema lo más claro posible, si alguien necesita más aclaraciones, pregunte.

Las respuestas urgentes serán muy apreciadas,

Aclamaciones

****Actualizar*****

Estoy utilizando el ViewPagerIndicator, en lugar del ViewPager predeterminado.

En relación con la función notifyDataSetChanged (), tengo dos experiencias diferentes.

Cuando utilicé mi subclase de ArrayAdapter para actualizar un ListView, funcionó directamente. Cuando llamé notifyDataSetChanged (), los elementos ListView se actualizan.

Sin embargo, cuando utilicé una subclase de FragmentStatePagerAdapter para actualizar un ViewPager, llamar a notifyDataSetChanged () no funcionó. NotifyDataSetChanged () es responsable de llamar a la función onChanged () de todos los DataSetObserver registrados, pero los observadores no se han registrado automáticamente como en ArrayAdapter. Tienes que hacer el trabajo de tierra por ti mismo.

Para mi sorpresa, DataSetObserver no es una interfaz sino una clase abstracta. Así que no podría simplemente implementarlo en mi subclase de fragmento. Tengo que definir una subclase de DataSetObserver, a continuación, definir un campo miembro en esta clase como una referencia a mi fragmento, y en la función overriden onChanged () actualizar su visualización Ver. El código es el siguiente:

 public class DetailFragDataSetObserver extends DataSetObserver { private DetailTextFragment view_instance; protected static ArrayList<DetailFragDataSetObserver> list = new ArrayList<DetailFragDataSetObserver>(); public DetailFragDataSetObserver(DetailTextFragment f){ view_instance = f; list.add(this); } public DetailTextFragment getView(){ return view_instance; } public static DataSetObserver findDataSetObserverFor(DetailTextFragment f){ for ( int i = 0; i<list.size(); i++){ if ( list.get(i).getView() == f) return list.get(i); } return null; } public static void release(DataSetObserver observer){ list.remove(observer); ((DetailFragDataSetObserver)observer).view_instance = null; } @Override public void onChanged(){ assert null != view_instance; view_instance.vUpdateData(); } } 

Tienes que tener cuidado. Debe recordar anular la referencia y anular el registro del objeto DataSetObserver en su fragmento de superposición.onDestroy (), de lo contrario el fragmento no se puede recolectar basura.

Más tarde, al examinar los códigos fuente, encontré ArrayAdapter y FragmentStatePagerAdapter y no son hermanos. Son totalmente diferentes. Ellos son en realidad de diferentes paquetes:

  android.widget.ArrayAdapter android.support.v4.app.FragmentStatePagerAdapter 

Es por eso que el primero funcionó fácilmente, mientras que el segundo no.

  • Comunicación entre Fragmentos en ViewPager
  • La aplicación se bloquea al asignar un nuevo adaptador a mi ViewPager
  • FragmentStatePagerAdapter OutOfMemoryError
  • Quitar todos los fragmentos de ViewPager poblados por FragmentStatePagerAdapter
  • ¿Cómo evitar recrear Fragment en ViewPager?
  • ViewPager primer fragmento mostrado siempre es incorrecto con FragmentStatePager
  • FragmentPagerAdapter y FragmentStatePagerAdapter
  • Destruye el elemento del adaptador de ViewPager después de cambiar la orientación de la pantalla
  • Guardar / Actualizar los datos de EditText del fragmento en un FragmentStatePagerAdapter
  • Ver Pager Crash Null Pointer Excepción debido a navegar de nuevo al fragmento antiguo - Android
  • Fragmento getView () siempre devuelve null para Fragments creado por un FragmentStatePagerAdapter
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.