2014-08-27 49 views
4

我很努力调试我的Android应用程序中的列表视图奇怪的UI故障。 99%的时间一切看起来和像它应该的工作,但时不时地我的列表视图奇怪。当你重新启动应用程序时,listview再次看起来很正常。自定义列表视图奇怪的UI故障

有谁知道这是不是一个已知的android bug?

事实上,它只发生在随机(我试图找出一个模式和不能)我吓坏了。我还没有找到任何关于类似问题的在线信息。希望我刚刚搜索错误的搜索条件。

任何意见/帮助将不胜感激。

在此先感谢。

什么ListView控件通常是这样的:

What the listview looks like most of the time

ListView的样子时不时:

What happens every now and then

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

在xml中使用wrap_content – 2014-08-27 13:32:10

+2

您可以评论每个视图的XML是什么?很难看到每张照片在视觉上代表什么。例如,您有3个TextView,但只能在图片中看到2个 – 2014-08-27 13:32:58

+2

另外,您应该使用MATCH_PARENT,除非您需要支持API <8 – 2014-08-27 13:35:20

回答

0

感谢您的帮助。我设法清理了很多布局文件。

UI毛刺发生的原因是由于加载了错误的样式文件。它只发生在我使用该风格之前加载另一个元素时。为了解决这个问题,我创建了一个专门用于列表视图的新样式,并将其分配给listview元素。

0

尝试每次膨胀新视图而不是重新使用它们。我知道这不是最好的事情,但在某些时候,我有类似的问题,这是唯一的工作。

2

我认为有几件事情正在造成这种情况。从经验来看,我注意到RelativeLayout有时不会根据可用空间适当调整它的大小。如果一个孩子的某个方面在某个地方没有适当的界限,它会更快地让一些东西被剪掉。另外,我认为TextView的一些尺寸不足以显示文本。我在这里做了下面的事情,所以它可能需要一些调整,但它应该画布局的图片来尝试。不幸的是,它不像您当前的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。您不需要仅用于查看项目点击事件的视图。根布局本身可以按原样进行。您可能遇到了此设置的问题。查看this post,它告诉你如何正确地获取一行,以便在嵌入ImageButton时进行单击。