Interferencia de la interfaz de usuario de Listview personalizada

Estoy luchando para depurar un fallo extraño de la interfaz de usuario para los listviews en mi aplicación para Android. 99% del tiempo todo se ve y funciona como debería, pero de vez en cuando mis listas se comportan extrañamente. Al reiniciar la aplicación, la vista de lista parece normal de nuevo.

¿Alguien sabe si este es un conocido error de Android?

El hecho de que sólo sucede al azar (he intentado imaginar un patrón y cant) me asusta. No he podido encontrar cualquier cosa en línea con respecto a ediciones similares. Espero que haya estado buscando en Google los términos de búsqueda equivocados.

Cualquier consejo / ayuda sería muy apreciada.

Gracias por adelantado.

Lo que el Listview suele ser:

Lo que la lista parece la mayor parte del tiempo

Lo que la vista de lista parece de vez en cuando:

Que pasa de vez en cuando

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="@dimen/tile_height_padded" android:descendantFocusability="blocksDescendants" android:layout_margin="0dp" android:padding="@dimen/padding_list"> <!--This is the clickable background of the item--> <ImageView android:id="@+id/imageview_poi_tile_detail_button_detail" android:background="@color/ca" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="0dp" android:layout_toLeftOf="@+id/imageview_poi_tile_map_button"/> <!--This is the Grey vertical line next to the icon on the left--> <ImageView android:id="@+id/delimiter_poi_tile" android:layout_width="@dimen/delimiter_size" android:layout_height="@dimen/tile_description_height" android:layout_marginTop="@dimen/margin_list_vertical" android:layout_marginBottom="@dimen/margin_list_vertical" android:background="@color/git" android:layout_toRightOf="@id/imageview_poi_tile_icon"/> <!--This is the red map button on the right--> <ImageView android:id="@id/imageview_poi_tile_map_button" android:background="@color/lr" android:src="@drawable/map" android:scaleType="fitCenter" android:padding="@dimen/image_button_padding" android:layout_width="@dimen/button_size" android:layout_height="match_parent" android:layout_alignParentRight="true"/> <!--This is the marker Icon on the left--> <ImageView android:id="@+id/imageview_poi_tile_icon" android:src="@drawable/poidefaultgit" android:scaleType="fitStart" android:padding="@dimen/image_button_padding" android:background="@color/ca" android:layout_width="@dimen/button_size" android:layout_height="@dimen/tile_description_height" android:layout_margin="0dp"/> <!--This is the bold title text, eg. BARONS--> <TextView android:id="@+id/textview_poi_tile_type" android:background="@color/ca" android:paddingLeft="@dimen/padding_list" android:layout_margin="0dp" android:gravity="left|top" android:textAppearance="?android:attr/textAppearanceSmall" android:textStyle="bold" android:text="Poi Type" android:ellipsize="end" android:maxLines="1" android:textColor="@color/git" android:layout_width="match_parent" android:layout_height="@dimen/tile_title_height" android:layout_toRightOf="@id/delimiter_poi_tile" android:layout_toLeftOf="@+id/textview_poi_tile_distance"/> <!--This is the address that is shown, eg 3 ADDERLEY ST, CAPE TOWN,--> <TextView android:id="@+id/textview_poi_tile_description" android:background="@color/ca" android:paddingLeft="@dimen/padding_list" android:layout_margin="0dp" android:gravity="left|top" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Address" android:ellipsize="end" android:maxLines="1" android:textColor="@color/git" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/textview_poi_tile_type" android:layout_toRightOf="@id/delimiter_poi_tile" android:layout_toLeftOf="@id/imageview_poi_tile_map_button"/> <!--This will display a string when the gps is on, not shown in image as gps was off in screenshot--> <TextView android:id="@id/textview_poi_tile_distance" android:background="@color/ca" android:textColor="@color/lr" android:text="" android:paddingRight="@dimen/padding_list" android:layout_margin="0dp" android:gravity="left|top" android:textAppearance="?android:attr/textAppearanceSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/imageview_poi_tile_map_button"/> 

  @Override public View getView(int position, View convertView, ViewGroup parent) { TextView description; TextView type; TextView distance; ImageView imageView; ImageView mapIcon; ImageView clickableArea; if(convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.listitem_poi, parent, false); description = (TextView) convertView.findViewById(R.id.textview_poi_tile_description); type = (TextView) convertView.findViewById(R.id.textview_poi_tile_type); distance = (TextView) convertView.findViewById(R.id.textview_poi_tile_distance); imageView = (ImageView) convertView.findViewById(R.id.imageview_poi_tile_icon); mapIcon = (ImageView) convertView.findViewById(R.id.imageview_poi_tile_map_button); clickableArea = (ImageView) convertView.findViewById(R.id.imageview_poi_tile_detail_button_detail); convertView.setTag(new ViewHolder(description, type, distance, imageView, mapIcon, clickableArea)); } else { ViewHolder viewHolder = (ViewHolder) convertView.getTag(); description = viewHolder.description; type = viewHolder.type; distance = viewHolder.distance; imageView = viewHolder.imageView; mapIcon = viewHolder.mapIcon; clickableArea = viewHolder.clickableArea; } final int finalIndex = position; final PointOfInterest poi = getItem(position); description.setText(poi.getDescription()); type.setText(poi.getName()); imageView.setImageResource(R.drawable.poidefaultgit); distance.setText(poi.getDistance()); return convertView; } 

Creo que hay varias cosas que están causando esto. Por experiencia, he notado que a veces RelativeLayout no clasifica adecuadamente a sus hijos en función del espacio disponible. Pronto dejará que algo se corte si uno de los lados de un niño no está bien delimitado en alguna parte. Además, creo que algunos de los tamaños de los TextViews simplemente no son suficientes para mostrar el texto. Hice lo siguiente en la parte superior de mi cabeza aquí por lo que puede necesitar algunos ajustes, sin embargo, debe pintar la imagen de la disposición para probar. Desafortunadamente no es tan plana como su XML actual, pero debería arreglar su problema. Lo siento, no en una computadora para probar esto en la actualidad.

 <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <!--This is the marker Icon on the left--> <!--Use margin if you need more space to divider--> <ImageView android:id="@+id/imageview_poi_tile_icon" android:src="@drawable/poidefaultgit" android:scaleType="fitStart" android:padding="@dimen/image_button_padding" android:background="@color/ca" android:layout_width="@dimen/button_size" android:layout_height="match_parent"/> <!--This is the Grey vertical line next to the icon on the left--> <!--Use margin to determine how close the line is to the top/bottom of item--> <ImageView android:id="@+id/delimiter_poi_tile" android:layout_width="@dimen/delimiter_size" android:layout_height="match_parent" android:layout_marginTop="@dimen/margin_list_vertical" android:layout_marginBottom="@dimen/margin_list_vertical" android:src="@color/git" android:background="@color/ca"/> <RelativeLayout android:gravity="center_vertical" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" android:background="@color/ca"> <!--This is the bold title text, eg. BARONS--> <TextView android:id="@+id/textview_poi_tile_type" android:paddingLeft="@dimen/padding_list" android:textAppearance="?android:attr/textAppearanceSmall" android:textStyle="bold" android:text="Poi Type" android:ellipsize="end" android:maxLines="1" android:textColor="@color/git" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <!--This is the address that is shown, eg 3 ADDERLEY ST, CAPE TOWN,--> <TextView android:id="@+id/textview_poi_tile_description" android:paddingLeft="@dimen/padding_list" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Address" android:ellipsize="end" android:maxLines="1" android:textColor="@color/git" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/textview_poi_tile_type"/> <!--This will display a string when the gps is on, not shown in image as gps was off in screenshot--> <TextView android:id="@id/textview_poi_tile_distance" android:textColor="@color/lr" android:text="" android:paddingRight="@dimen/padding_list" android:textAppearance="?android:attr/textAppearanceSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/textview_poi_tile_type"/> </RelativeLayout> <!--This is the red map button on the right--> <ImageButton android:id="@id/imageview_poi_tile_map_button" android:background="@color/lr" android:src="@drawable/map" android:scaleType="fitCenter" android:padding="@dimen/image_button_padding" android:layout_width="@dimen/button_size" android:layout_height="match_parent"/> </LinearLayout> 

La idea aquí es tener todo el artículo en un LinearLayout que se ajusta al tamaño del contenido. Confíe en él para conseguir todo horizontalmente en el lugar. A continuación, sólo envuelva los TextViews en un Relativelayout . Sólo tiene la alineación TextViews debajo y al lado de los demás. Haga que el RelativeLayout preocupe realmente centrándolos en consecuencia. Está ponderado para asegurar que se estira para llenar cualquier espacio restante en horizontal.

Además, el botón del mapa puede ser un ImageButton. No necesita una vista únicamente para tomar el evento de clic de artículo. El diseño de la raíz sí mismo puede hacerlo como es. Probablemente haya encontrado un problema con esta configuración. Echa un vistazo a este post que le dice cómo obtener correctamente una fila para hacer clic cuando un ImageButton está incrustado.

Intente inflar una nueva vista cada vez en lugar de volver a usarlas. Sé que no es la mejor cosa que hacer, pero en algún momento tuve problemas similares y esto fue lo único que funcionó.

Gracias por la ayuda. Me las arreglé para limpiar el archivo de diseño mucho.

La razón por la que se produjo el fallo de la interfaz de usuario se debe al archivo de estilo incorrecto cargado. Sólo ocurrió cuando cargué otro elemento antes que usara ese estilo. Para solucionarlo, creé un nuevo estilo específicamente para las vistas de lista y lo asigné a los elementos listview.

  • Actualizar fragmento actual (datos ListView) que permanece en la misma actividad
  • ListView: selectores dibujables dibujados en diferentes tamaños
  • Gif no animado en el listview personalizado
  • Desplazamiento a través de ListView con algunas imágenes muy laggy
  • Cambiar en el adaptador para un ListView
  • Fragmento de NavigationDrawer con ListView y encabezado personalizado
  • El evento Onclick se realiza incluso con un clic largo
  • Deslice ListView de lado como en la nueva aplicación de GMail
  • Selección múltiple en ListView personalizado con CAB
  • Espacio vacío entre el encabezado listview y el primer elemento
  • Android: Cómo rellenar un ListView con el indexador de alfabeto y fastscroll como en la aplicación de contactos.
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.