ListView被绘制两次

时间:2013-06-26 10:30:19

标签: android android-listview

所以我现在很困惑。我正在使用XML布局,所以我可以像这样显示一个空视图:

<?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="fill_parent" >

    <RelativeLayout
        android:id="@android:id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="@string/samples_empty"
            android:textAppearance="?android:attr/textAppearanceLarge" />

    </RelativeLayout>

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" >

    </ListView>

</RelativeLayout>

你可能已经在这里看过十亿次了。

所以我做setContentView(R.layout.foo)并且它第一次工作,但是如果我返回到这个Activity(就像onPause已被调用然后onResume)我得到了这个:

alt text

我在适配器上调用notifyDataSetChanged();并且工作正常,我没有得到的是它被抽出两次的原因?

它不像我正在创建一个新的ListView然后将它添加到视图中,我相信如果我是的话我会知道它。

适配器的getView方法:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    RecordView av;
    if(convertView == null){
        av = new RecordView(mCtx, this, mRecords[position], position);
    }else{
        av = (RecordView) convertView;
        av.setRecord(mRecords[position]);
    }
    return av;
}

这将是正常情况......

alt text

注意

这似乎不是每次都发生,并且不会发生在单个事件发生时,但是当它发生时,它从我从另一个屏幕返回时发生。

更新

我注意到当我在顶部有另一个活动时(一些透明的东西,比如Facebook聊天头,那么我可以看到问题已经发生了,它似乎不会发生在onResume上,但更有可能发生在onPause上)我实际上什么也没做。

2 个答案:

答案 0 :(得分:1)

尝试将listview的android:layout_height="wrap_content"更改为android:layout_height="fill_parent"

答案 1 :(得分:1)

您遇到此问题是因为每次转换视图仍然存在旧视图并且正在重复使用时,您每次都动态创建行视图。要解决此问题,您应该在动态创建它们时为每个视图(即RecordView中的每个子视图)指定一个ID,例如RecordView类中的子视图应该是像这样实例化

TextView tv = new TextView(this.getContext());
tv.setId(1);
    ...

然后,在你的getView:

if(convertView == null){
    av = new RecordView(mCtx, this, mRecords[position], position);
}else{
    av = (RecordView) convertView;
    av.findViewById(1).setText(mRecords[position]);
}

假设您的mRecords包含一个String数组。如果您有不同行的变体布局,则可以为每个视图提供type。有关详细信息,请参阅this