【问题标题】:Delete item from listview and database从列表视图和数据库中删除项目
【发布时间】:2015-05-03 07:44:17
【问题描述】:

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

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

【问题讨论】:

    标签: android sqlite listview android-listview


    【解决方案1】:

    这两个选项都可以,但不同的人会选择不同的方式。第二种方法更容易且更推荐,因为您将所有工作留给Loader,由Google 开发。 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);
    }
    

    换句话说,我认为没有任何理由选择第一种方法,而第二种方法让生活更轻松。

    【讨论】:

    • 我知道,但是在这种情况下,正如我所说的,当用户按下删除按钮时,项目并没有被删除,而是在稍后的时间,所以它可能有点奇怪。
    • 对不起,“未删除”是什么意思?延迟删除?这是处理用户输入和程序逻辑的方式,Loader 将重新加载,只有在数据库中发生更改时才会重新加载,而不是之前。删除时显示等待的对话框(如果要删除的数据很大)。
    • 好的,所以你是说,要“掩盖”可能的延迟,请使用对话框或类似的东西。它可以工作,谢谢:)
    • 防止用户同时乱按所有按钮的对话框。如果需要完全“延迟”,则可以使用 TimerTaskHandler 或其他东西。干杯:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多