Los elementos ListView y de altura variable provocan problemas de desplazamiento
Tengo un ListView
que utilizo para desplazar una lista de campos, un texto y una foto. Ambas alturas son dinámicas : la vista de texto puede contener un párrafo muy largo o simplemente una oración, y la imagen se ajusta a la anchura, por lo que la altura es variable (se puede ver la foto). Algunos artículos incluso no tienen una imagen. Esto hace que los elementos sean muy heterogéneos en altura. Hay un elemento que puede ser de 2 pantallas de largo, mientras que otro sólo una línea de texto.
Tengo que trabajar, etc. pero cuando me desplazo hacia arriba, como se recicla vistas se insertan en la parte superior, la posición de desplazamiento salta aproximadamente el tamaño del nuevo niño. Desplácese hacia abajo funciona perfectamente …
- Cómo desplazarse mediante programación WebView de Android
- ¿Hay una manera de forzar un WebView para actualizar su imagen (vista), mientras se desplaza?
- Cómo detener el desplazamiento de la vista de desplazamiento principal cuando se desplaza la vista de desplazamiento secundaria en android?
- Cómo desplazarse a la parte inferior en un ScrollView en inicio de actividad
- ¿Puedo deshabilitar el desplazamiento en TextView cuando se utiliza LinkMovementMethod?
Entiendo más o menos por qué, obviamente, las vistas recicladas son totalmente diferentes en tamaño, y esto hace que algún algoritmo de desplazamiento no, dondequiera que sea.
He leído sobre sobreponderar itemType()
y itemTypeCount
, pero no sé si está relacionado con mi problema. En las pruebas que hice no funcionó (mágicamente).
¿Se puede arreglar esto fácilmente, cualquier truco o solicitud mágicaLayout aquí y allá?
Hay un tipo que sugiere escribir un reciclador de Vista para arreglar esto: la pregunta listview se desplaza bastante chatarra cuando hay diferentes alturas de fila
¿Escribir un View recycler
sería tan terriblemente complicado como suena?
Perdon por la pregunta abstracta
- ScrollBy no funciona correctamente en recyclerview anidado
- Android personalizado listview muy lento al desplazarse
- ¿Cómo usar scrollVerticallyBy () con Android RecyclerView y LayoutManager?
- Desplazar un ListView por píxeles en Android
- Cómo desplazar WebView a la parte superior de android?
- Restablecer TextView vaya a la parte superior
- El desplazamiento de texto no funciona
- Crear un RecyclerView con desplazamiento horizontal y vertical
Sólo recuerda la altura de ImageView y TextView, y luego cuando tus vistas se están reciclando, establece la altura para esas vistas desde el método getView en tu ListAdapter (necesitas extender BaseAdapter para esto).
Así que tienes una lista de objetos con tus datos (algún texto, tal vez una URL de imagen, etc). Agregue un campo entero llamado imageHeight. Cuando cargue la imagen para un elemento de lista por primera vez, guarde la altura del ImageView en ese campo de entero en el objeto de datos asociado con ese elemento de lista. A continuación, en getView en su ListAdapter, establezca la altura de ImageView con el valor de imageHeight.
Esto hará que su adaptador devuelva una vista que tenga la altura adecuada. Por supuesto, esto sólo funciona si ya conoce la altura de la imagen / texto que va a cargar. Esto será cierto si se desplaza hacia arriba, ya que esos elementos ya se han cargado.
Trate de almacenar en caché las imágenes (en WeakHashMap) en getView y, a continuación, el desplazamiento hacia arriba no tendrá que recargar la imagen, que causan el recálculo de altura fea …
No utilice el método convertView del método getView (int position, View convertView, ViewGroup parent).
Tienes que inflar la fila cada vez que se llama al getView. Hará que el desplazamiento sea algo lento, pero su problema será resuelto.