当我调用notifyDataSetChanged()时,为什么我的ListView不能更新?

时间:2012-03-13 01:18:36

标签: java android

我即将完成我的第一个Android应用程序,但当我从我的应用程序中提供ListView的SQLite数据库中删除项目时,我正在与一个奇怪的错误作斗争。该项目被删除,如果我从ListView切换回来,它会更新,但在我这样做之前,列表不会更新。

我在这里发布了大部分课程:https://gist.github.com/2025973,但这是从文件第56行开始的相关回调:

builder.setPositiveButton(R.string.button_delete,
    new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            databaseConnector.deleteSimpleDie(arg3);
            storedDiceAdapter.notifyDataSetChanged();
        }
    });

我在这里做错了什么?我确信这很简单。我最初在Async中有删除,但后来我根本无法调用notifyDataSetChanged(),因为它必须从创建Cursor的线程发生。

更新

好吧,这是非常贫民窟(我想......)但我终于有了它的工作。有人想告诉我这是多么可怕的错误?基本上,我只是在回调中重新实例化整个CursorAdapter。它解决了这个问题,但我怀疑它有一些我不知道的负面副作用。

builder.setPositiveButton(R.string.button_delete,
    new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            databaseConnector.deleteSimpleDie(arg3);

            String[] from = new String[] { "name", "description" };
            int[] to = new int[] { R.id.dice_name, R.id.dice_description };

            storedDiceAdapter = new SimpleCursorAdapter(StoredDice.this,
                    R.layout.stored_dice_item, null, from, to);
                setListAdapter(storedDiceAdapter);
        }
    });

4 个答案:

答案 0 :(得分:2)

如果您将基础数据集设置为新的,那么适配器所持有的引用将会中断。例如,这会破坏适配器:

    Globals.diceList = newDiceList;

当您想要完全更改数据集时,请尝试更多类似的功能,这样可以省去不断重新设置适配器的麻烦。

    Globals.diceList.clear();
    Globals.diceList.addAll(newDiceList);

虽然在你的情况下,你应该使用简单的"删除"相反的选择。这将修改列表的内容,而不会更改其引用的位置。 (Java很奇怪,我知道。)

我写了一篇更深入的文章here

答案 1 :(得分:0)

尝试在notifyDataSetChanged()

之后添加listView.invalidate()

答案 2 :(得分:0)

我认为你的问题是对话:

public void onClick(DialogInterface dialog, int which) {
                        databaseConnector.deleteSimpleDie(arg3);
                        storedDiceAdapter.notifyDataSetChanged();
                    }

当显示对话框时,您的活动将处于onPauseonStop状态,这次活动不会刷新ui,所以建议:当完成notifyDataSetChanged时,您可以忽略对话框,{{ 1}}方法,也可以调用onResume

答案 3 :(得分:0)

我之前遇到过类似的问题,但我不确定它是否完全相同。 你可以尝试一下。

  1. 创建一个Adapter类,而不是继承BaseAdapter或适合您需要的适配器。
  2. 创建一个公共方法,例如setNewData(List)来更新内部列表。
  3. 每当有更改时,请在调用notifyDataSetChanged()之前更新内部列表。
  4. 它适用于我的情况。

    对您的代码进行轻微修改:

    builder.setPositiveButton(R.string.button_delete,
    new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            databaseConnector.deleteSimpleDie(arg3); // Update DB
            storedDiceAdapter.setNewData(listData); // Update internal list
            storedDiceAdapter.notifyDataSetChanged(); // Notify changes
        }
    });