我正在尝试从 ListView 和 sqlite 数据库中删除一个项目。这个网站上有几个问题,但我找不到合适的解决方案。我的问题与设计有关。我的意思是:Android 上的数据库访问应该以异步方式完成,以避免停止主线程。实际上,我当前的 ListView 是使用 android Loader 加载的,它会通知数据库上的任何操作并调用 onContentChanged()
。问题是如何进行删除:什么是最好的策略?我看到两种方式:
- 从适配器中删除,对其调用
notifyDataSetChanged()
,然后使用AsyncTask
(或类似的)从数据库中删除。 Loader 将被通知。在这种情况下,可能存在刷新问题,因为适配器因加载程序更新而再次更新。 - 使用 AsyncTask(或类似的)删除项目并使用 Loader 等待更新。在这种情况下,问题是当用户删除项目时 UI 没有更新,但它稍后会被删除(如果没有发生错误),所以从用户的角度来看可能有点奇怪。
最佳答案
这两个选项都可以,但不同的人会选择不同的方式。就您将所有工作留给 Google
开发的 Loader
而言,第二种方式更简单也更值得推荐。
doc说它会自动刷新数据,只需要使用回调作为 onLoadFinished
和 onLoadReset
来完成它:
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
mAdapter.swapCursor(data);
}
当 Loader
被重置时“清理”适配器:
public void onLoaderReset(Loader<Cursor> loader) {
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
mAdapter.swapCursor(null);
}
换句话说,我看不出有任何理由选择第一种方法,因为第二种方法能让生活更轻松。
关于android - 从 ListView 和数据库中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30011439/