2011-03-07 136 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