2011-03-07 138 views
0

我有一個自定義適配器的ListView創建包含TextViews,可能有1或2行文本的行。滾動後滾動列表視圖中的佈局

news_row.xml:

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

    <TextView android:id="@+id/text" 
     android:layout_width="fill_parent" 
     android:layout_height="48dip" 
     android:padding="6dp" 
     android:textSize="14sp"> 
    </TextView> 
</LinearLayout> 

適配器:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.news_row, null); 
    } 
    else { 
     TextView titleView = (TextView)convertView.findViewById(R.id.text); 
     System.out.println(titleView.getText() + " to **" + 
       stories.get(position).title); 
    } 

    TextView titleView = (TextView)convertView.findViewById(R.id.text); 
    titleView.setText(stories.get(position).title); 
    titleView.setGravity(Gravity.CENTER_VERTICAL); 

    return convertView; 
} 

滾動之後,一些單行TextViews出現對齊行的頂部,和一些2線TextViews處於該行的底部。當最初包含2行TextView的行被賦予單行文本時,問題似乎就會發生,反之亦然。

我曾經認爲在getView中設置重力會解決這個行回收問題,但它必須是別的東西。如果我每次在行被回收時以編程方式創建TextView,該怎麼辦?這是什麼需要「重置」它?

回答

0

的解決方案是設置線的TextView的數目(Veeresh所述),但不能在初始充氣。

titleView.setLines(2); 

不完全滿意的(如果我有n行?),它甚至沒有任何意義考慮到TextView的高度在佈局文件中已經設置作了明確規定。好吧。

1

行視圖在listView中重用。前10名(我猜10或者可能更少)首次膨脹,尺寸/重力等被設置。當用戶在可見行下滾動時,頂行被回收並饋送到下一個即將到來的行。因此,最上面一行的視圖被重新用於下一行。如果您的首行和下一個即將到來的行具有不同的行數,則您所看到的行爲是預期的。

解決方案。在初始膨脹期間設置文本重力和線條數量,所有行將具有相同的大小,而不管其中的行數。你不應該再看到你正在觀察的波動。

見本說明更多細節http://android.amberfog.com/?p=296

+0

我不明白 - 如何設置初始膨脹時的線數?無論行數是多少,我都希望文本居中。本教程暗示我想用不同的佈局來獲得這個結果,這對我來說沒有意義。我甚至不知道如何確定TextView需要多少行來呈現文本。 – 2011-03-08 03:05:07