在加载数据之前,如何避免ListView闪烁由@android:id / empty设置的视图。

时间:2014-08-23 22:20:08

标签: android listview

我正在从sqlite数据库加载数据以填充listview。但是,当应用程序运行时,它会显示与空视图关联的视图(@android:id / empty),然后它将被列表视图中的数据替换。有没有办法避免这种情况。

    <ListView
    android:id="@android:id/list"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:divider="@drawable/top_drop_shadow"
    android:dividerHeight="5dp"
    android:padding="5dp" >
</ListView>

<TextView
    android:id="@android:id/empty"
    android:paddingLeft="15dp"
    android:paddingRight="15dp"
    android:textAlignment="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:drawableBottom="@drawable/read_book"
    android:text="Nothing to read here, go read a book instead"
    android:textSize="20sp"
    android:textStyle="bold" >
</TextView>

2 个答案:

答案 0 :(得分:1)

要避免此行为,请仅在加载数据并更新适配器时提供空视图。

答案 1 :(得分:1)

仅仅通过代码示例扩展Simon的回答,覆盖我的CursorAdapter isEmpty()对我来说非常有效:

@Override
public boolean isEmpty() {
    if (getCursor() == null) {
        return false; // Data not yet loaded, so don't show empty view
    }
    else {
        return super.isEmpty(); // Data loaded, so show empty view if required
    }
}

使用此解决方案,我不需要更改布局文件,但这是为了完整性:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView 
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@android:color/transparent"
        android:dividerHeight="@dimen/activity_vertical_margin" >
    </ListView>

    <TextView android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="No data"/>

</FrameLayout>

注意 - 在我的Java代码中,我没有调用getListView().setEmptyView()或类似的东西,所以我的所有布局代码都保留在布局文件中。 :)