Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何处理托管选项菜单对话框中的listView项更改?_Android - Fatal编程技术网

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

Android 如何处理托管选项菜单对话框中的listView项更改?,android,Android,我在activitiesonCreateDialog方法中创建一个对话框,如下所示 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.dial

我在activities
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();
我调试了
Thread.currentThread().getId()
,发现它总是“1”(创建对话框并更改项目列表)

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

我怎样才能/应该使事情顺利进行


谢谢你的建议

阅读您的文章,我感觉您没有正确地使用
onSaveInstanceState()
onRestoreInstanceState()保存/还原某些内容。

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

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

这可能与您收到的错误消息一致,适配器中发生了一些更改,但是没有注意到
ListView
,除非这可能是由于我解释的不一致的状态保存/恢复引起的,而不是线程问题


确保正确保存和还原适配器的状态。

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

我不会暂停活动-因此我不会在SaveInstanceState上执行
onRestoreInstanceState
/
onRestoreInstanceState
。用户只需在“活动”中选择不同的父项,我需要在“选项菜单”对话框中显示不同的子项列表。目前,我为对话框ListView创建了一个新的
适配器
,并将其通过
onPrepareDialog
中的ListView。因此,我不必创建一个新的对话框,但我认为现有的适配器应该注意到数据本身的变化,并通知ListView。不过,谢谢你的回复。我明白了,我被提到“保存和恢复”的句子弄糊涂了。我很确定对话框在主UI线程中运行,此错误消息会误导我。您是否将
ArrayAdapter.setNotifyOnChange()
设置为true,或者在数据更改后正确调用
Adapter.notifyDataSetChanged()
?如果这个问题仍然存在,我会亲自尝试使用自定义的
适配器
,通过子类化
BaseAdapter
。它非常简单,更灵活,可以避免一些
ArrayAdapter
“魔法”。
ArrayAdapter.setNotifyOnChange()
适配器。notifyDataSetChanged()
完成了我想要的任务。如果你更新你的答案,我会接受!谢谢你的支持!好!!我添加了另一个答案,而不是更新我的第一个答案,以避免混淆。
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)]