android - 从 ListView 和数据库中删除项目

标签 android sqlite listview android-listview

我正在尝试从 ListView 和 sqlite 数据库中删除一个项目。这个网站上有几个问题,但我找不到合适的解决方案。我的问题与设计有关。我的意思是:Android 上的数据库访问应该以异步方式完成,以避免停止主线程。实际上,我当前的 ListView 是使用 android Loader 加载的,它会通知数据库上的任何操作并调用 onContentChanged()。问题是如何进行删除:什么是最好的策略?我看到两种方式:

  1. 从适配器中删除,对其调用 notifyDataSetChanged(),然后使用 AsyncTask(或类似的)从数据库中删除。 Loader 将被通知。在这种情况下,可能存在刷新问题,因为适配器因加载程序更新而再次更新。
  2. 使用 AsyncTask(或类似的)删除项目并使用 Loader 等待更新。在这种情况下,问题是当用户删除项目时 UI 没有更新,但它稍后会被删除(如果没有发生错误),所以从用户的角度来看可能有点奇怪。

最佳答案

这两个选项都可以,但不同的人会选择不同的方式。就您将所有工作留给 Google 开发的 Loader 而言,第二种方式更简单也更值得推荐。 doc说它会自动刷新数据,只需要使用回调作为 onLoadFinishedonLoadReset 来完成它:

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/

相关文章:

c# - Unity 操作系统输入检测

java - 闪屏跳过触摸事件

android - 如何保护 Assets 文件夹中的数据库 sqlite(通过加密)?

arrays - React-native Sqlite,强制 ListView 用新数据更新

c# - ASP.NET Web UI ListView 不会刷新

android - Android 登录验证失败

android - 9 补丁 Android 不显示边距

java - 在 JAVA 中对两个非常大的 CSV 文件进行性能比较和查询

java - 如何从sqlite数据库获取总金额值

android - 调用 setSelection() 后,ListView 不再对 onclick 使用react