2009-12-13 84 views
13

我正在使用带有RelativeLayout订单项的ListView的布局。线条本身不能正确显示。Android的RelativeLayout似乎打破了

问题是txtVideoDuration TextView是在行项目的顶部而不是底部绘制的。因此,txtVideoTitle的高度为0.正如你在XML中看到的那样,txtVideoDuration应该被限制在ListView的底部。

我的目标是让布局看起来像谷歌给我的教程。示例:http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html

我正在使用Android 2.0.1。我甚至在没有修改ListView的情况下插入示例布局,并发生相同的行为。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="?android:attr/listPreferredItemHeight" 
android:padding="6dip"> 
<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:id="@+id/imgVideoThumbnail" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentBottom="true" 
    android:minHeight="64dip" 
    android:layout_marginRight="6dip" 
    android:src="@drawable/icon" /> 
<TextView 
    android:id="@+id/txtVideoDuration" 
    android:layout_width="fill_parent" 
    android:layout_height="26dip" 
    android:layout_toRightOf="@+id/imgVideoThumbnail" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentRight="true" 
    android:singleLine="true" 
    android:ellipsize="marquee" 
    android:text="0:00:00" /> 
<TextView 
    android:id="@+id/txtVideoTitle" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@+id/imgVideoThumbnail" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:layout_above="@+id/txtVideoDuration" 
    android:layout_alignWithParentIfMissing="true" 
    android:gravity="center_vertical" 
    android:text="[Title]" 
    android:textColor="#FFFFFF" /> 

</RelativeLayout> 

这个简单的例子起作用。这是该活动的根目录XML布局。顶部的错误代码是列表视图中的行项目。看来ListView本身正在打破它。

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

<ListView 
    android:id="@+id/listVideoCatalog" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 
<TextView 
    android:id="@+id/txtName" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:text="Hello World" /> 
</RelativeLayout> 
</merge> 

这是将行项目充入ListView的getView代码。

static class ViewHolder 
{ 
    TextView txtTitle; 
    ImageView imgThumbnail; 
    TextView txtDuration; 
    Uri videoLocation; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    ViewHolder holder; 

    if(convertView == null) 
    { 
     LayoutInflater li = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = li.inflate(R.layout.listitem_videolineitem, null); 
     holder = new ViewHolder(); 
     holder.txtDuration = (TextView) convertView.findViewById(R.id.txtVideoDuration); 
     holder.txtTitle = (TextView) convertView.findViewById(R.id.txtVideoTitle); 
     holder.imgThumbnail = (ImageView) convertView.findViewById(R.id.imgVideoThumbnail); 
     convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    VideoFile video = this.videos.get(position); 
    holder.txtDuration.setText(millisToTimestamp(video.videoDuration)); 
    holder.txtTitle.setText(video.videoTitle); 

      // Some debugger visual code. 
    holder.txtDuration.setBackgroundColor(Color.GREEN); 
    holder.txtTitle.setBackgroundColor(Color.CYAN); 


    return convertView; 
} 

回答

10

你怎么夸大你的行视图是“越野车”?你能提供一个代码片段吗?

另外,android:orientation="vertical"对于RelativeLayout无效。

+0

刚添加的代码。我使用的是Google建议的ViewHolder模式。 – 2009-12-13 20:06:45

+0

我从RelativeLayout中删除了垂直方向。这段代码并没有对bug造成影响,但是感谢您指出了这一点。我删除它。 – 2009-12-13 20:13:26

+7

更改li.inflate(R.layout.listitem_videolineitem,null); li.inflate(R.layout.listitem_videolineitem,parent,false);并看看是否有帮助。 – CommonsWare 2009-12-13 21:16:19

15

这回答了接受答案的评论。只是要清楚,这就是答案:

变化

li.inflate(R.layout.listitem_videolineitem, null);

li.inflate(R.layout.listitem_videolineitem, parent, false);

相关问题