0

所以我现在比较迷茫。我正在使用 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) 并且它第一次工作,但是如果我返回这个活动(如 onPause 被调用然后 onResume)我得到这个:

替代文字

我调用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;
}

这将是它通常看起来的样子......

替代文字

笔记

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

更新

我注意到当我在顶部有另一个活动时(透明的东西,比如 facebook 聊天头,然后我可以看到问题已经发生了,它似乎没有发生在 onResume 上,但更有可能发生在我实际上的 onPause 上不要在里面做任何事情。

4

2 回答 2

1

尝试将android:layout_height="wrap_content"列表视图更改为android:layout_height="fill_parent"

于 2013-06-26T10:43:10.813 回答
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拥有一个字符串数组。如果您有不同行的变体布局,您可以为每个视图提供一个类型。有关更多详细信息,请参阅内容。

于 2013-06-27T06:39:45.240 回答