2009-12-13 22 views
13

Sto lavorando a un layout in cui utilizzo un ListView con gli elementi pubblicitari RelativeLayout. I lineitems stessi non vengono visualizzati correttamente.RelativeLayout di Android sembra rotto

Il problema è che txtVideoDuration TextView viene disegnato nella parte superiore dell'elemento pubblicitario anziché in quello inferiore. Per questo motivo txtVideoTitle ottiene un'altezza pari a 0. Come si può vedere nel file XML, txtVideoDuration deve essere bloccato nella parte inferiore di ListView.

Il mio obiettivo è avere il layout simile al tutorial che mi ha dato google. Esempio: http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html

Sto usando Android 2.0.1. Ho persino inserito il layout di esempio senza modifiche nel ListView e succede lo stesso comportamento.

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

Questo semplice caso funziona. Questo è il layout XML di base per l'attività. Il codice buggy nella parte superiore sono gli elementi pubblicitari nella visualizzazione elenco. Sembra che lo stesso ListView lo stia rompendo.

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

Questo è il codice getView che gonfia l'elemento pubblicitario in 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; 
} 

risposta

10

Come si gonfiano le viste di riga che sono "buggy"? Puoi fornire uno snippet di codice?

Inoltre, android:orientation="vertical" non è valido per RelativeLayout.

+0

appena aggiunto il codice. Sto usando il pattern ViewHolder suggerito da google. –

+0

Ho rimosso l'orientamento verticale dal RelativeLayout. Quel codice non ha contribuito al bug ma grazie per averlo fatto notare. L'ho rimosso. –

+7

Cambia li.inflate (R.layout.listitem_videolineitem, null); a li.inflate (R.layout.listitem_videolineitem, parent, false); e vedere se questo aiuta. – CommonsWare

15

Questa risposta è stata data nel commento della risposta accettata. Giusto per mettere in chiaro, questa è la risposta:

Change

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

a

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

Problemi correlati