¿Cómo mantener la posición de ListView cuando se utilizan las nuevas API de cargador?

En Honeycomb el Cargador Las API se introdujeron como la forma adecuada de proporcionar datos a una aplicación haciendo el trabajo pesado en un hilo en segundo plano. En mi aplicación, estoy trabajando para reemplazar todos mis Cursors con Loaders ese regreso Cursors. Ya que Cursor.requery() está depreciado ahora, se recomienda simplemente llamar restartLoader y permitir que el trabajo se vuelva a realizar en un hilo de fondo y luego changeCursor cuando regresa en onLoadFinished.

Todo esto funciona maravillosamente, excepto que 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?

preguntado el 28 de agosto de 11 a las 00:08

Podrías usar getScrollX() y getScrollY() almacenarlo en caché antes de actualizar y, a continuación, volver a configurarlo manualmente. No estoy seguro de si esto provocaría destellos visuales u otras molestias. : - / -

2 Respuestas

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

Desafortunadamente, solo devolver un Cursor desde loadInBackground no permite que el ContentObserver para notificar correctamente al Loader cuando los datos cambian, esto se debe a AbstractCursor solo llamadas notifyChanged() cuando requery() se llama en el Cursor.

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

Respondido 28 ago 11, 12:08

Simplemente no debe crear un nuevo adaptador en cada carga de Loaders; 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 tu adaptador crea un método para recargar artículos

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

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

Respondido 16 Feb 15, 13:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.