Пользовательский список Listview weird UI glitch

Я изо всех сил пытаюсь отлаживать странный пользовательский интерфейс для списков в моем приложении для Android. В 99% случаев все выглядит и работает так, как должно, но время от времени мои списки ведут себя странно. При перезапуске приложения список выглядит нормально.

Кто-нибудь знает, если это известная ошибка андроида?

Тот факт, что это происходит только случайным образом (я пытался выяснить рисунок и не могу), пугает меня. Я не мог найти что-нибудь в Интернете по поводу аналогичных вопросов. Надеюсь, я только что искал неправильные поисковые термины.

Любые советы / помощь будут высоко оценены.

Заранее спасибо.

Как обычно выглядит Listview:

То, как выглядит список в большинстве случаев

То, как выглядит listview, время от времени выглядит следующим образом:

То, что происходит время от времени

<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; } 

Я думаю, что есть несколько вещей, которые вызывают это. По опыту, я заметил, что RelativeLayout иногда не будет соответствующим образом определять размер своих детей на основе свободного места. Скорее пусть что-то обрезается, если какая-то одна из сторон ребенка где-то не ограничена. Кроме того, я думаю, что некоторых размеров для TextViews недостаточно для отображения текста. Я сделал следующее сверху головы, поэтому может потребоваться некоторая настройка, однако он должен нарисовать изображение макета, чтобы попробовать. К сожалению, он не так плоский, как ваш текущий XML, но он, надеюсь, исправит вашу проблему. Извините, не на компьютере, чтобы проверить это сейчас.

 <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> 

Идея здесь состоит в том, чтобы весь элемент в LinearLayout обертывался до размера содержимого. Полагайтесь на то, чтобы все было горизонтально. Затем заверните только TextViews в Relativelayout . Просто TextViews ниже и сбоку друг от друга. Имейте RelativeLayout беспокоиться о фактическом центрировании их соответственно. Он взвешен, чтобы обеспечить его растягивание для заполнения любого оставшегося пространства по горизонтали.

Кроме того, ваша кнопка карты может быть ImageButton. Вам не требуется просмотр только для того, чтобы принять событие щелчка элемента. Сама корневая компоновка может сделать это как есть. Вероятно, у вас возникла проблема с этой настройкой. Проверьте это сообщение, в котором рассказывается, как правильно получить строку для щелчка при вставке ImageButton.

Попробуйте раздувать новое представление каждый раз, вместо повторного использования. Я знаю, что это не лучшая вещь, но в какой-то момент у меня были подобные проблемы, и это было единственное, что сработало.

Спасибо за помощь. Мне удалось очистить файл макета.

Причина, по которой происходит сбои пользовательского интерфейса, связана с загрузкой файла неправильного стиля. Это произошло только тогда, когда я загрузил другой элемент до того, как он использовал этот стиль. Чтобы решить эту проблему, я создал новый стиль специально для списков и присвоил его элементам listview.