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:

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!

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 configurar la sombra de una vista en Android?
  • Cambios en una página web a través de JavaScript que no aparecen en WebView. ¿Hay una manera de forzar el WebView para volver a dibujar su contenido?
  • Cómo obtener una vista desde un evento de coordenadas en android cuando la vista establecer la rotación?
  • Cómo iniciar una actividad desde la vista personalizada
  • cargar pdf desde url en android
  • Obtener ids de vista en un bucle for por programa?
  • Agregar vista al grupo de vistas xml existente en el código
  • Android ampliablelistview grupo / padre imagen de fondo cambiar cuando se colapsan o expanden
  • Las vistas agregadas dinámicamente desaparecen en orientación en Android
  • Cómo convertir linearlayout a imagen
  • Problema para agregar vista dinámicamente en Linearlayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.