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?
- Después de mantener el estado de colapso / expansión para nivel N o Multinivel lista ampliable algunos subgrupos no se muestran
- Using notifyItemRemoved o notifyDataSetChanged con RecyclerView en Android
- Menú contextual de un ListFragment
- Scrollview vs listview en android
- ¿Cómo utilizar correctamente TextSwitcher en ListView?
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 vista de lista parece 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; }
- Mejora de la suavidad de desplazamiento en un ListView de Android
- Getview Llamado varias veces en android
- ¿Cómo puede escuchar los eventos de clic en un ListView que se producen fuera de los elementos de la lista?
- foco perdido después de notifyDataSetChanged ()
- Cómo obtener datos de adaptador personalizado en ListView?
- Uso de ListView: ¿Cómo agregar una vista de encabezado?
- UIL, Picasso - Las imágenes en adaptador siempre se recargan cuando se detiene el desplazamiento
- Alinear dos TextViews, una izquierda a la otra derecha, en un ListView sin estirar los fondos
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.
- Android Material Design cajón de navegación setClickListener
- ¿Cómo usar Simplify Commerce Payment API en Android?