Obtener Vista para el elemento ListView / orden inversa en 2.2; Funciona en 4.0.3
Tengo un ListView que muestra los elementos de ArrayAdapter. Quiero animar la vista cuando es cliked. El problema es que en diferentes versiones de android estoy recibiendo diferentes vistas (ver más abajo)
Estoy recibiendo la vista de ListActivity usando este método:
- Android - Añadir dinámicamente vistas a la vista
- Vista de lista expandible
- Android habilita el botón Atrás en la vista web
- Multi-nivel ExpandableListView en Android
- Android: ExpandableListViews y casillas de verificación
private View getViewForListPosition(int position) { int firstPosition = mList.getFirstVisiblePosition() - mList.getHeaderViewsCount(); int wantedChild = position - firstPosition; ZLog.d(LOG,"getViewForListPosition , position : " + position + ", wantedChild : " + wantedChild + ", view hash : " +mList.getChildAt(wantedChild).hashCode()); for(int i = mList.getChildCount(); i>0; i--){ ZLog.d(LOG, "pos : " + (i-1) + ", hash : " +mList.getChildAt(i-1).hashCode()); } return mList.getChildAt(wantedChild); }
Así que en Android 4.0.3 y 4.2.2 teléfono consigo:
getViewForListPosition , position : 3, wantedChild : 3, view hash : 1101734248 pos : 5, hash : 1104109360 pos : 4, hash : 1104254936 pos : 3, hash : 1101734248 pos : 2, hash : 1104876880 pos : 1, hash : 1104862296 pos : 0, hash : 1104793008
Entonces cuando se hace clic en el elemento mi método getView
adaptador se ejecuta para cada vista:
getView, position : 0, convertView is notnull, cv hash1104793008 getView, position : 1, convertView is notnull, cv hash1104862296 getView, position : 2, convertView is notnull, cv hash1104876880 getView, position : 3, convertView is notnull, cv hash1101734248 getView, position : 4, convertView is notnull, cv hash1104254936 getView, position : 5, convertView is notnull, cv hash1104109360
Así que puedes ver que todo está bien y funciona como se esperaba. Sin embargo, cuando ejecuto esto en Android 2.2, estos son los resultados que estoy recibiendo:
getViewForListPosition , position : 3, wantedChild : 3, view hash : 1205607672 pos : 5, hash : 1205730120 pos : 4, hash : 1205712904 pos : 3, hash : 1205607672 pos : 2, hash : 1206547728 pos : 1, hash : 1206483960 pos : 0, hash : 1207864856 getView, position : 0, convertView is notnull, cv hash1205730120 getView, position : 1, convertView is notnull, cv hash1205712904 getView, position : 2, convertView is notnull, cv hash1205607672 getView, position : 3, convertView is notnull, cv hash1206547728 getView, position : 4, convertView is notnull, cv hash1206483960 getView, position : 5, convertView is notnull, cv hash1207864856
Por lo que podría haber notado getViewForListPosition
me devolverá la vista que el adaptador utiliza para la posición 2
Es posible que también haya notado que el Adapter.getView
o ListView.getChildAt
está devolviendo elementos en orden inverso que causa este problema. ¿Cuál podría ser la razón de este comportamiento? (No estoy haciendo nada extravagante en mi adaptador)
Estaré agradecido por cualquier tipo de pista. ¡Gracias!
- Vista vacía en el adaptador de lista expandible
- YouTubePlayerFragment en ListView con AppCompatActivity Error
- Proper onDestroy () / Cómo evitar fugas de memoria
- La animación de vista de Android se detiene al salir de la pantalla
- ExpandableListView no aparece cuando se inicia la actividad
- Cómo crear un ImageView que llena la altura de los padres y muestra una imagen lo más grande posible?
- ¿Cómo encadenar la animación en android a la misma vista?
- El método setLayoutParams () no funciona
DE ACUERDO. Así que esto es lo que está sucediendo:
En un ListView
limpio Cuando registro onItemClickListener
y realizo clics el método getView
adaptador para las vistas no se llama. Esto es lo que yo esperaría.
Si establezco un mList.setChoiceMode(ListView.CHOICE_MODE_SINGLE)
esto hace que los métodos getView
ejecuten justo después de que se registre el clic. Esto es también lo que se espera.
Sin embargo, la diferencia entre las versiones 2.2 y 4+ es que: en 2.2: cuando esta actualización ocurre, getView
opera en una lista invertida de vistas (vea mi pregunta) en 4+ (posiblemente API 11+): getView
funciona en el orden normal de la lista
Cuál es la parte más interesante es que cuando retraso la llamada a getViewForListPosition por 10ms todo trabaja muy bien y el adaptador tiene lista apropiada de opiniónes (orden normal otra vez). Por lo tanto, parece que el orden de las vistas se invierte sólo durante la actualización del adaptador con CHOICE_MODE_SINGLE
Para resolver este problema no cambie el modo listview a CHOICE_MODE_SINGLE
para que el adaptador no se dispare durante el clic. Puse bg / graphics para el artículo onItemClicked
en mi propio dentro onItemClicked
Espero que salve a alguien algún tiempo 🙂
- ¿Cómo desactivar lockscreen en android?
- Dirección del elemento de derecha a izquierda en android con más de 4,2