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

如何避免ListView在加载数据之前闪烁@android:id/empty设置的视图。,android,listview,Android,Listview,我正在从sqlite数据库加载数据以填充listview。但是,当应用程序运行时,它会显示与空视图(@android:id/empty)关联的视图,然后被列表视图中的数据替换。有没有办法避免这种情况 <ListView android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="wrap_content" android:animat

我正在从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>


为了避免这种行为,请仅在加载数据并更新适配器后提供空视图。

仅用一个代码示例来扩展Simon的答案,覆盖my
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()
或类似的东西,因此我所有的布局代码都保留在布局文件中。:)

谢谢,但是如果您看到我使用的是默认ID,那么我不会使用空视图到列表的显式赋值。这是否意味着我需要定义自定义ID并在代码中手动分配?是的,您可以这样做。或者您可以创建一个自定义适配器,并重写
isEmpty()
方法。只要没有更新数据,就返回
false
,在我重构代码但仍然得到错误后返回
super.isEmpty()
`View emptyLv=rootView.findviewbyd(R.id.feedlist\u empty);FeedListAdapter FeedListAdapter=新的FeedListAdapter(getActivity().getApplicationContext(),R.layout.feed_项,项);lv.setAdapter(feedListAdapter);lv.setEmptyView(emptyLv);`包括每次销毁片段时尝试重置空视图`@Override public void onDestroy(){super.onDestroy();lv.setEmptyView(null);}`