2009-12-13 15 views
13

Pracuję nad układem, w którym używam elementów listView z RelativeLayout. Same linijki nie wyświetlają się poprawnie.RelativeLayout systemu Android wydaje się być uszkodzony

Problem polega na tym, że tekstTxtVideoDuration TextView jest rysowany u góry elementu zamiast u dołu. Z tego powodu txtVideoTitle ma wysokość 0. Jak widać w XML, txtVideoDuration ma być zaciśnięty na dole ListView.

Moim celem jest, aby układ wyglądał jak samouczek, który dał mi Google. Przykład: http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html

Używam Androida 2.0.1. Podłączyłem nawet przykładowy układ bez modyfikacji do ListView i zachowuje się to samo zachowanie.

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

Ten prosty przypadek działa. To jest główny układ XML dla działania. Błędny kod u góry to elementy zamówienia w widoku listy. Wygląda na to, że ListView sam go łamie.

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

To jest kod getView, który powoduje zawyżenie pozycji do listy 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; 
} 

Odpowiedz

10

W jaki sposób nadmuchujesz swoje widoki wierszy, które są "błędne"? Czy możesz podać fragment kodu?

Również, android:orientation="vertical" nie jest ważne dla RelativeLayout.

+0

właśnie dodaje kod. Używam wzorca ViewHolder sugerowanego przez google. –

+0

Usunąłem pion orientacji z RelativeLayout. Ten kod nie przyczynił się do błędu, ale dzięki za wskazanie go. Usunąłem to. –

+7

Zmień li.inflate (R.layout.listitem_videolineitem, null); do li.inflate (R.layout.listitem_videolineitem, parent, false); i zobacz, czy to pomaga. – CommonsWare

15

Zostało to odebrane w komentarzu z zaakceptowanej odpowiedzi. Żeby było jasne, to jest odpowiedź:

Zmień

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

do

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

Powiązane problemy