Android ArrayAdapter no está borrando?

Tengo un problema extraño con una implementación personalizada de Android ArrayAdapter. Para dar un poco de fondo, estoy tratando de actualizar el contenido de un ListView mientras preserva la posición de desplazamiento actual.

Tengo un servicio que ejecuta un subproceso para actualizar datos que se muestra en el ListView. Que los datos se almacenan en un ArrayList y que ArrayList se utiliza para generar algunos ArrayAdapters personalizados para el ListView. Los adaptadores también se actualizan cuando se presiona un elemento de ListView (ya sea añadiendo o quitando un elemento). Solía ​​crear nuevos adaptadores cada vez que había cualquier tipo de cambio y, a continuación, establecer este nuevo adaptador para el ListView. Esto funcionó, pero hizo que el ListView para desplazarse a la parte superior cada vez. Dada la naturaleza de mi solicitud, esto era indeseable. La posición desplazada actual en el ListView debe mantenerse entre actualizaciones.

En lugar de crear nuevos adaptadores comencé a borrar el adaptador que necesitaba para actualizar usando el método clear () del adaptador, luego reconstruir los elementos del adaptador usando el método add () del adaptador. Ambos de estos métodos se están llamando en el adaptador. Los adaptadores están todos configurados para notifyDataOnChange en sus constructores así que no tengo que llamar manualmente notifictyDatasetChanged () cada vez (aunque dado mi problema, he intentado llamar manualmente así como sin resultado).

Esto es lo que mi adaptador personalizado se parece a:

public class RealmAdapter extends ArrayAdapter<Realm> { Context c; public RealmAdapter(Context context, int resource, int textViewResourceId) { super(context, resource, textViewResourceId); setNotifyOnChange(true); c = context; } @Override public View getView(int position, View convertView, ViewGroup parent) { ... } ... } 

Larga historia corta, aquí está mi problema. Cuando llamo clear () en el adaptador, el adaptador no está siendo borrado.

He aquí un fragmento de mi onPostExecute en mi hilo que hace la actualización. Estoy seguro de ponerlo aquí por lo que se está actualizando en el hilo de la interfaz de usuario. También tengo este código exacto copiado en un método privado en mi actividad de IU. Este código no funciona en ningún lugar:

 appState.favoriteAdapter.clear(); Log.d(LOG_TAG, "COUNT: " + appState.favoriteAdapter.getCount()); for(Realm r : appState.favorites) { appState.favoriteAdapter.add(r); } Log.d(LOG_TAG, "COUNT: " + appState.favoriteAdapter.getCount()); 

Como ejemplo, si el adaptador anterior tenía 3 elementos en él, llamar a un getCount () justo después de que clear () devuelve 3 en lugar de 0. Del mismo modo, si el appState.favorites ArrayList sólo tiene 2 elementos en él, getCount ( ) Después de que el bucle todavía está volviendo 3, no 2. Debido a que el adaptador no está respondiendo a ninguna de estas llamadas que hace imposible actualizar de ninguna manera. Puedo publicar un Logcat más tarde si eso será útil, pero no hay excepciones ni nada útil que se muestra.

Después de romper mi cabeza durante horas, el problema que parece estar teniendo es que el adaptador no está respondiendo a las llamadas a los métodos que lo alteran. He intentado pasar un ArrayList vacío en la llamada super () del adaptador, esto no ayuda. ¿Estoy perdiendo algo o usando el ArrayAdapter incorrectamente? He buscado por todas partes y ya he comprobado muchos de los problemas comunes, tales como la modificación de la matriz subyacente y esperando que se actualice, no llamar (o en mi configuración de la carcasa en el adaptador) notifyDatasetChanged (), y con un sin soporte Operación en la colección subyacente.

La declaración del favoritoAdapter es muy simple y está contenida en mi clase de aplicación:

 public RealmAdapter favoriteAdapter; 

Aquí está la inicialización de la favoriteAdapter desde arriba:

 if(appState.favoriteAdapter == null) { appState.favoriteAdapter = new RealmAdapter(c, R.layout.list_item, R.layout.realm_entry, appState.favorites); } else { appState.favoriteAdapter.clear(); Log.d(LOG_TAG, "COUNT: " + appState.favoriteAdapter.getCount()); for(Realm r : appState.favorites) { appState.favoriteAdapter.add(r); } Log.d(LOG_TAG, "COUNT: " + appState.favoriteAdapter.getCount()); } 

El código anterior está en mi subproceso de interfaz de usuario y el subproceso que descarga los datos actualizados.

Debajo del código de arriba se coloca un filtro:

 if(appState.favoriteAdapter != null && RealmSelector.realmFilter != null) appState.favoriteAdapter.getFilter().filter(RealmSelector.realmFilter.getText().toString()); 

¿El filtro afectaría a borrar la lista? La lógica no dictaría …

Tenía los filtros que eran aplicados al ArrayAdapter de encargo. Aparentemente esto interfiere con la adición y la eliminación de elementos del propio adaptador? He añadido este código a mi método y ahora está funcionando:

 if(appState.favoriteAdapter != null && realmFilter != null) { appState.favoriteAdapter.getFilter().filter(realmFilter.getText().toString()); } 

Me encantaría que alguien pudiera explicar por qué esto importa. Pensé que los filtros estaban destinados a seleccionar subconjuntos de elementos en el adaptador. En mis pruebas estaba dejando el cuadro de texto que se utiliza para el filtro vacío, por lo tanto, ningún texto de filtro real debería haber sido aplicado. Una vez más, si alguien sabe lo que está pasando y podría explicarme por qué esto corrige el problema que me encantaría saber.

  • Vista de lista de Android con sectionHeader e índice ambos
  • ¿Cómo recargar / refrescar el fragmento que ya se ha mostrado una vez?
  • Cómo obtener el tamaño de una vista de lista
  • ¿Cómo puedo crear un menú de opciones de diapositivas para los elementos de ListView de Android?
  • ExpandableListView con opción múltiple guardar el elemento seleccionado en un array
  • Eliminar elemento haciendo clic en cualquier elemento de listview
  • Widget de la aplicación de Android listview onclick listener
  • ¿Cómo aplicar setItemChecked (position, true) con RecyclerView en Android?
  • Desplazamiento síncrono de un encabezado ListView parcial
  • Pulse ListView cuando aparezca el teclado sin ajustarPan
  • Crear listview con separadores alfabéticos android - cómo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.