如何在托管选项菜单对话框中处理listView项目更改?

时间:2011-06-03 09:06:47

标签: android

我在我的活动onCreateDialog方法中创建了一个对话框,如下所示

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.select_dialog_item, android.R.id.text1, items);
dialog = new AlertDialog.Builder(this).setTitle(R.string.dialogTitle).setAdapter(adapter,
        new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int item) {
                // do something
            }
        }).create();

我想在对话框中显示的项目位于一个简单的ArrayList

private List<String> items = new ArrayList<String>();

我的活动现在管理(保存和恢复)对话框 - 据我所知。因此,每次用户按下菜单按钮打开对话框时都不会重新创建它。

根据活动的某些用户选择 - 需要更改对话框的项目列表。我认为这不是什么大问题但是在更改列表的内容之后我遇到了以下异常:

06-03 10:55:29.263: ERROR/AndroidRuntime(276): java.lang.IllegalStateException: 
The content of the adapter has changed but ListView did not receive a notification. 
Make sure the content of your adapter is not modified from a background thread, 
but only from the UI thread. [in ListView(16908785, class com.android.internal.app.AlertController$RecycleListView) with Adapter(class android.widget.ArrayAdapter)]

我调试了Thread.currentThread().getId()并发现它始终为“1”(创建对话框并更改项目列表)。

如何处理项目列表更改以便我的对话框注意到?或者我应该避免使用“托管”对话框并在每次用户打开时从头开始创建它?

我该如何/应该让事情有效?

感谢您的任何建议!

2 个答案:

答案 0 :(得分:1)

确保启用ArrayAdapter.setNotifyOnChange(),或在数据更改后正确调用Adapter.notifyDataSetChanged()。

答案 1 :(得分:0)

读你,我觉得你没有使用onSaveInstanceState()onRestoreInstanceState().

正确保存/恢复某些内容

暂停和恢复活动时,将自动保存和恢复托管对话框的视图层次结构。这显然包括ListView

但是,如果适配器状态和/或数据未恢复到先前的状态,则ListView可能会检测到其自身(已恢复)状态与连接的适配器之间的不一致。例如,如果适配器中的项目数在暂停/恢复后发生变化,我可以想象出问题。

这可能与您获得的错误消息一致,但适配器中的某些内容已更改,但ListView没有被注意到,除非这可能是由于我解释的状态保存/恢复不一致造成的,而不是线程问题。

确保正确保存并恢复适配器的状态。