2011-08-28 13 views
10

En Honeycomb, las API Loader se introdujeron como la forma adecuada de proporcionar datos a una aplicación haciendo un trabajo pesado en una cadena de fondo. En mi aplicación estoy trabajando para reemplazar todos mis Cursor s con Loader s que devuelven Cursor s. Dado que el Cursor.requery() se depreció ahora, se recomienda simplemente llamar al restartLoader y permitir que el trabajo vuelva a realizarse en una cadena de fondo y luego changeCursor cuando vuelva al onLoadFinished.¿Cómo mantener la posición de ListView cuando se usan las nuevas API de Loader?

Todo esto funciona maravillosamente excepto que el ListView no mantiene su posición de desplazamiento cuando quiero volver a consultar los datos, usando Cursor.requery() esto solía funcionar porque era la misma instancia de Cursor con datos actualizados.

¿Cómo puedo actualizar mi cargador sin perder la posición de desplazamiento?

+0

Usted puede usar 'getScrollX() 'y' getScrollY() 'para almacenar en caché antes de actualizar, y luego configurarlo manualmente de nuevo. No estoy seguro si esto daría lugar a un destello visual u otro desagrado. : - / –

Respuesta

6

La clase Loader por sí sola no sabe cuándo cambia el conjunto de datos y es la implementación específica de CursorLoader actualmente. Ahora, dentro de mi aplicación, los datos que necesitaba actualizar estaban dentro de una base de datos SQLite local (sin ContentProvider), así que tuve que modificar el CursorLoader para usar mi base de datos local, como Dianne Hackborne mencionó en el developer group.

desgracia acaban de volver de un cursor de loadInBackground no permite la ContentObserver para notificar adecuadamente el cargador cuando cambian los datos, esto se debe a AbstractCursor sólo llamadas notifyChanged() cuando requery() se llama en el cursor.

Dado que el ContentObserver nunca notificará al Loader que los datos han cambiado, terminé llamando al Loader.onContentChanged() según sea necesario. En este punto, todo parece estar funcionando, pero actualizaré esta respuesta si surge algún problema importante.

0

No debe crear un nuevo adaptador en cada carga de cargadores; Quiero decir ..

@Override 
    public void onLoadFinished(Loader<List<NotificationItem>> loader, List<NotificationItem> notifications) { 
     // We must do it in this way to not losing listview scroll position after a reload. 
     if(mAdapter==null) { 
      mAdapter = new HomeUserActivityListAdapter(getActivity(), notifications); 
      mListView.setAdapter(mAdapter); 

     }else{ 
      mAdapter.refill(notifications); 
     } 
    } 

Y en ti adaptador de crear un método para rellenar elementos

public void refill(List<NotificationItem> notifications) { 
    mNotificationsList.clear(); 
    mNotificationsList.addAll(notifications); 
    notifyDataSetChanged(); 
} 

Y eso es todo, mantendrá su posición de desplazamiento exactamente :-)

Cuestiones relacionadas