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.
- Adaptador personalizado getView () no se está utilizando la biblioteca PullToRefresh
- Selección de TextView con Spannable y LinkMovementMethod
- ListFragment con adaptador personalizado
- Cómo setCurrentPage en ViewPager según la selección del usuario y cómo sé qué artículo de la lista llamó la actividad
- Cómo intercambiar elementos ListView con animación?
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 …
- ¿Cómo puedo crear un ListView con esquinas redondeadas en Android?
- Android listview, el cambio de casilla de verificación al azar
- ¿Cómo cambiar el icono de la aplicación Android creada en Google App Inventor?
- Cómo evitar el parpadeo en la barra de acción mientras showinh y ocultarlo en el desplazamiento
- Mostrar divisor después del último elemento de la lista
- Android desplácese hacia arriba ocultar vista y desplácese hacia abajo mostrar el efecto de vista como twitter
- SearchView en ActionBar - problemas con el botón * Up *
- Android ListView no se actualiza después de notifyDataSetChanged
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.
- AutoCompleteTextView no reconoce espacios
- Canvas.drawBitmap () tarda más tiempo en dibujar el mapa de bits por primera vez mientras que el mosaico del mapa de bits