views:

1971

answers:

2

I'm working on a layout where I use a ListView with RelativeLayout line items. The lineitems themselves are not displaying correctly.

The issue is that the txtVideoDuration TextView is drawn at the top of the line item instead of the bottom. Because of this the txtVideoTitle gets a height of 0. As you can see in the XML the txtVideoDuration is supposed to be clamped to the bottom of the ListView.

My goal is to have the layout resemble the tutorial that google gave me. Example: http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html

I'm using Android 2.0.1. I've even plugged in the example layout with out modification into the ListView and the same behavior happens.

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

This simple case works. This is the root XML layout for the activity. The buggy code at the top is the line items in the list view. It seems that the ListView itself is breaking it.

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"&gt;
<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>

This is the getView Code that inflates the line item into the ListView.

    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;
}
+4  A: 

How are you inflating your row views that are "buggy"? Can you provide a code snippet?

Also, android:orientation="vertical" is not valid for RelativeLayout.

CommonsWare
Just added the code. I'm using the ViewHolder pattern suggested by google.
Jeremy Edwards
I removed the orientaton vertical from the RelativeLayout. That code did not contribute to the bug but thanks for pointing it out. I removed it.
Jeremy Edwards
Change li.inflate(R.layout.listitem_videolineitem, null); to li.inflate(R.layout.listitem_videolineitem, parent, false); and see if that helps.
CommonsWare
Whoa this fixed the problem! Thanks.
Jeremy Edwards
Yeah, I made this mistake too for a long time. RelativeLayout just doesn't behave well in list rows using the first inflation technique, but the one where you pass in its eventual parent works.
CommonsWare
+4  A: 

This was answered in the comment of the accepted answer. Just to make it clear, this is the answer:

Change

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

to

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

BoD