Android CursorAdapter.swapCursor第一次不刷新

Android CursorAdapter.swapCursor第一次不刷新,android,android-listview,android-cursoradapter,android-cursorloader,Android,Android Listview,Android Cursoradapter,Android Cursorloader,我有一个列表活动,并使用游标加载程序加载存储在ContentProvider中的数据。我使用一个自定义类扩展CursorAdapter来显示列表项。在LoaderCallbacks onLoadFinished中,我有以下内容: public void onLoadFinished(加载器加载器,游标newCursor){ 游标适配器.swapCursor(新游标); } 我有一个ListActivity的自定义布局,其中包括一个带有android:id=“@android:id/empty”

我有一个列表活动,并使用游标加载程序加载存储在ContentProvider中的数据。我使用一个自定义类扩展CursorAdapter来显示列表项。在LoaderCallbacks onLoadFinished中,我有以下内容:

public void onLoadFinished(加载器加载器,游标newCursor){
游标适配器.swapCursor(新游标);
}
我有一个ListActivity的自定义布局,其中包括一个带有
android:id=“@android:id/empty”
的文本视图

问题是,当我第一次打开应用程序时,调用
swapCursor
不会刷新ListView,即使ContentProvider中有数据要显示。当我向ListView添加一个新项目时,列表会正确刷新。但是,如果我注释掉TextView,它在没有可用数据时显示一个简单的文本,则应用程序会按预期工作。swapCursor调用会自动相应地更新ListView


有没有想过为什么会发生这种情况,或者是否有一种正确的方法可以做到这一点,因为我相信调用notifyDataSetChanged不会起作用,因为在非常特殊的情况下刷新失败?

您遇到了这个问题,因为
ListActivity
会自动将空视图(如果可用)设置为
ListView

我建议您尝试以下其中一种:

  • 扩展活动并在
    swapCursor
    调用后执行

    listView.setEmptyView(findViewById(android.R.id.empty);
    
  • 使空视图消失:
    android:visibility=“消失”
    和之后的
    swapCursor
    调用

    findViewById(android.R.id.empty).setVisibility(View.VISIBLE);
    
    listView.setEmptyView(findViewById(android.R.id.empty);
    
  • @onCreate调用
    listView.setEmptyView(null)
    swapCursor
    调用之后

    findViewById(android.R.id.empty).setVisibility(View.VISIBLE);
    
    listView.setEmptyView(findViewById(android.R.id.empty);
    

  • 不确定所有这些,但其中一个肯定会起作用:)

    如果旧光标不再使用,您应该使用
    changeCursor