ListView en la ficha de desplazamiento no se actualiza a menos que se reinicie

En mi aplicación, tiene dos pestañas, una es Recordatorio y la otra es Tarea Completada.

Introduzca aquí la descripción de la imagen

Cuando se hace clic en el botón de alternar, quiero mover la lista a la tarea completada.

La idea son:

  • Obtener el ID de fila comprobada desde sqlite
  • Recupere los datos basados ​​en id de la tabla de recordatorios e inserte en la tabla completada.
  • Método de recuperación de llamada en la ficha Completado.

Pero cuando hice clic en el botón de conmutación y paseo a Completado, todavía está vacío. Después de salir de la aplicación, y deslizar hasta la pestaña, sólo los datos mostrados.

¿Cómo puedo hacer que los datos se muestren de inmediato en la pestaña Completado al deslizar en lugar de salir de la aplicación y volver a abrirla de nuevo? Gracias

AllAdapter (Recordatorio)

holder.toggle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (((ToggleButton)v).isChecked()) { int getPosition = (Integer) v.getTag(); // Here we get the position that we have set for the checkbox using setTag. search.get(getPosition).setSelected(((ToggleButton) v).isChecked()); int id= search.get(getPosition).getID(); mdb = new MyDatabaseHelper(v.getContext()); database = mdb.getReadableDatabase(); Cursor cursor = database.rawQuery("SELECT * FROM " + MyDatabaseHelper.TABLE__TASK + " WHERE ID = ? ", new String[]{id+""}, null); if (cursor != null && cursor.getCount() > 0) { while (cursor.moveToNext()) { String allTask = cursor.getString(cursor.getColumnIndex("Title")); String name = cursor.getString(cursor.getColumnIndex("Name")); String allTime = cursor.getString(cursor.getColumnIndex("Time")); String allDate = cursor.getString(cursor.getColumnIndex("Date")); insertDataToCompleteTab(id,name,allTask,allTime,allDate); // insert to another table } } } else { int getPosition = (Integer) v.getTag(); // Here we get the position that we have set for the checkbox using setTag. search.get(getPosition).setSelected(((ToggleButton) v).isChecked()); } } }); 

Tarea Completa

 retrieveList(name); public void retrieveList(String name) { Toast.makeText(getActivity(),name,Toast.LENGTH_SHORT).show(); search.clear(); database = mdb.getReadableDatabase(); Cursor cursor = database.rawQuery("SELECT * FROM " + MyDatabaseHelper.TABLE_TASKCOMPLETED + " WHERE Name = ? ", new String[]{name}, null); if (cursor != null && cursor.getCount() > 0) { while (cursor.moveToNext()) { int iD = cursor.getInt(cursor.getColumnIndex("ID")); String allTask = cursor.getString(cursor.getColumnIndex("Title")); String allTime = cursor.getString(cursor.getColumnIndex("Time")); String allDate = cursor.getString(cursor.getColumnIndex("Date")); if (adapter != null) { adapter.add(iD, allTask, allTime, allDate); listview.setAdapter(adapter); adapter.getCount(); // check(); } } } else { } } 

Todo el adaptador

Http://pastebin.com/qbLDtf4v

Ficha Completada

Http://pastebin.com/WCCbZ0h4

CompleteAdapter

Http://pastebin.com/QdbuTQKm

5 Solutions collect form web for “ListView en la ficha de desplazamiento no se actualiza a menos que se reinicie”

De la documentación de Android para el ciclo de vida de los fragmentos

Sistema Los fragmentos onResume() o onPause() serán llamados sólo cuando se llama a Activities onResume() o onPause() . Están estrechamente unidos a la Actividad.

Debido a esto, no podrá actualizar su vista cuando cambie la pestaña.

Para resolver este problema encontré una solución en setUserVisibleHint en mi aplicación como estábamos teniendo el mismo requisito. Viewpager llamadas de Viewpager siguen la función de su fragmento y la aplican en su código del fragmento

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); // Make sure that we are currently visible if (this.isVisible()) { // If we are becoming invisible, then... if (!isVisibleToUser) { Log.d("TAG", "Stop animation and audio you are not visible"); } } } 

Esto es lo que dice la documentación

Establezca una sugerencia para el sistema acerca de si la interfaz de usuario de este fragmento está actualmente visible para el usuario. Esta sugerencia es true y es persistente a través del estado de instancia de fragmento save and restore. Una aplicación puede establecer esto como false para indicar que la interfaz de usuario del fragmento se desplaza fuera de la visibilidad o no es visible para el usuario. Esto puede ser utilizado por el sistema para priorizar operaciones tales como actualizaciones del ciclo de vida del fragmento o comportamiento de ordenamiento del cargador. Este método puede ser llamado fuera del ciclo de vida del fragmento. Y por lo tanto no tiene garantías de pedido con respecto a las llamadas de método de ciclo de vida de fragmento.

ViewPager llama a este en su childfragment. Para obtener más información, ViewPager también llama a setMenuVisibility que puede utilizar si se enfrenta a problemas al mostrar o quitar el Menú. Vea el enlace para setMenuVisiblity documnet que indica que

Establecer una pista para saber si el menú de este fragmento debe ser visible. Esto es útil si sabes que se ha colocado un fragmento en la jerarquía de la vista para que el usuario no pueda verlo en ese momento, de modo que tampoco se mostrarán los elementos de menú que tenga.

Por defecto las pestañas más cercanas dentro de ViewPager se cargan al mismo tiempo. Así que sucedió porque los datos se habían cargado en la segunda pestaña antes de hacer cualquier cambio con el botón de alternar. Para corregir un problema tiene que actualizar los datos en la pestaña completada en caso de que cambie cualquier dato.

Esto podría lograrse de varias maneras:

  • El primer fragmento debe enviar un evento en cada cambio y el segundo debería suscribirse en ese evento y actualizar los datos manualmente

  • Utilice el cargador y el proveedor de contenido (o simplemente los uri personalizados). Loader se suscribe a cualquier cambio de uri y los ayudantes de la base de datos del repositorio / dao notifican tal uri sobre cualquier cambio (cuando se han llamado métodos de inserción / actualización / eliminación)

context.getContentResolver().notifyChange(uri);

Cargador para sus objetos.

 abstract class CachedLoader<T> extends AsyncTaskLoader<T> { @Nullable private T cachedData; CachedLoader(Context context) { super(context); } void registerUri(Uri... observerUris) { for (Uri uri:observerUris) { getContext().getContentResolver().registerContentObserver(uri, true, createContentObserver()); } } ContentObserver createContentObserver() { return new ForceLoadContentObserver(); } @Override public void deliverResult(T data) { super.deliverResult(data); this.cachedData = data; } @Override public void onContentChanged() { super.onContentChanged(); cachedData = null; } @Override protected void onStartLoading() { if (!takeContentChanged() && cachedData != null) { deliverResult(cachedData); return; } forceLoad(); } @Override protected void onReset() { super.onReset(); cachedData = null; } } 

Llame al registro uri para suscribirse en ese uri cambia.

O utilice un CursorLoader , porque opera con cursores directamente. Como veo en la pregunta actualizada

Prefiero el segundo acercamiento, pero primero uno es más simple

Así que acabo de poner debajo del código en mi fragmento de tarea completada

  @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser){ retrieveList(name);//call the method to be refreshed } else{ //no } } 

Obteniendo la pista de @Swapnil y responda desde https://stackoverflow.com/a/40763755/5261462

Poner debajo del código en el fragmento onResumse como este

  @Override public void onResume() { super.onResume(); retrieveList(name); } 

Lo que usted podría hacer es crear una interfaz a lo largo de las líneas de

 public interface ReminderCompletedListener { void reminderCompleted(); } 

En CompletedTask cree una instancia de ese oyente y regístrelo en su actividad.

 ((MyActivity) getActivity()).setReminderCompletedListener(new ReminderCompletedListener() { @Override public void reminderCompleted() { retrieveList(name); } }); 

En tu actividad, crea un método que puedes llamar desde tu pulsador

 ((MyActivity) getActivity()).reminderCompleted(); 

Esto activará la recarga de la lista Completada cuando completes una tarea desde la pestaña Recordatorios. Una consideración principal a tomar de esta solución es que acopla directamente sus fragmentos con su actividad.

Theres otras soluciones a esto también, usted podría utilizar cosas como un autobús (eventbus / otto), probablemente rxjava también, usted puede explorar ésos si usted tiene gusto pero la solución de la vainilla que he dado debe hacer el trabajo fino.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.