在Android上刷新Adapter/ListView的最佳方法

Sim*_*mon 71 android listview refresh

我的书"Hello Android"将此作为一种使用自定义db帮助程序,设置游标,然后按如下方式设置适配器的方法:

Cursor cursor
CustomDatabaseHelper test = new CustomDatabaseHelper(this);
try {
        cursor = getData();
        showData(cursor);
} finally {
        test.close();
}
Run Code Online (Sandbox Code Playgroud)

但是,每当我需要刷新数据集时,我需要继续运行这段代码(由于"this"不可用,因此在按钮的onClick()中会有点困难.

这是刷新数据集的最佳方法,还是应该删除.close并发出adapter.notifyDataSetChanged()?如果我这样做,有时我会得到一个强制关闭(我现在不记得)但有时它无法正确删除 - 我想这可能是因为数据库当前是打开的并且它试图再次打开.

我们是否还要在Class中(在OnCreate之外)声明Cursors,DatabaseHelpers和Adapter的变量,以便所有函数都可以访问它们?

我意识到这只是在这个阶段的糟糕编程,但我试图得到一些关于最佳做事方式的指示.

Mac*_*rse 96

你应该用adapter.notifyDataSetChanged().当你使用它时,日志会说什么?


小智 16

只需在设置Adapter它之前添加这些代码:

    listView.destroyDrawingCache();
    listView.setVisibility(ListView.INVISIBLE);
    listView.setVisibility(ListView.VISIBLE);
Run Code Online (Sandbox Code Playgroud)

或者直接在更改数据资源后可以使用以下方法.

   adapter.notifyDataSetChanged()
Run Code Online (Sandbox Code Playgroud)


Jor*_*sys 13

在Android上刷新Adapter/ListView的最佳方法

不仅调用notifyDataSetChanged()将刷新ListView数据,setAdapter()必须先调用才能正确加载信息:

  listView.setAdapter(adapter);
  adapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)


Him*_*ims 12

以下代码适合我

EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter();
adp.UpdateDataList(EfficientAdapter.MY_DATA);
adp.notifyDataSetChanged();
QuickList.invalidateViews();
QuickList.scrollBy(0, 0);
Run Code Online (Sandbox Code Playgroud)

  • 调用notifyDataSetChanged()对我来说还不够.invalidateViews()改为起作用. (2认同)