2012-01-16 91 views
8

所以,如果我创建一个AlertDialog像这样:Android - 刷新AlertDialog中的数据?

AlertDialog.Builder b = new AlertDialog.Builder(); 
b.setItems(MyStringArray, MyListener); 
b.create().show(); 

然后,我要更新列表中的项目,即MyStringArray已更改为具有更多或更少的项目。我似乎无法找到办法做到这一点。到目前为止,我试过从AlertDialog获取ListView,但我似乎无法让.setAdapter工作。这是正确的方法,还是有更好的方法来做到这一点?

回答

9

我还没有尝试过自己,但从我建立的所有其他应用程序我很确定这将解决您的问题。

而不是使用setItems的,请尝试使用setAdapter()方法,并将已经从你StringArray初始化数据的ArrayAdapter。然后,当您知道数据已更改时,可以使用getListView()来获取您的View对象,并从那里调用getAdapter(),以便您现在直接处理数据集。您可以清除它,然后重新初始化它,或者只需添加/删除项目。从适配器对象中,如果调用notifyDataSetChanged()它应该使用刚刚提供给适配器的新数据集触发重新绘制。

希望能帮助你。让我知道如果它不。

DSC

+0

我还是有点新手与这些对话框工作时。我应该保持DialogInterface.OnClickListener为OnClickListener,还是像使用普通的Listview一样使用View.OnClickListener? – Paul 2012-01-16 07:21:06

+0

有点愚蠢的我问,当我可以试试它。看起来像DialogInterface.OnClickListener是要走的路。 – Paul 2012-01-16 07:27:10

1

如果你像我一样,你想用默认的适配器例如用于multichoice项目,那么还有一个办法。

就像其他适配器一样,只更新字符串数组对象,从对话框实例获取适配器,将其转换为适当的适配器并使其无效。

AlertDialog.Builder b = new AlertDialog.Builder(); 
b.setItems(MyStringArray, MyListener); 
AlertDialog instance = b.create(); 
instance.show(); 

// Later when you need to update 
MyStringArray[0] = "puf"; 
ListView list = instance.getListView(); 
// Now according to whether you used cursor or array for supplying items to the builder 
// you have to cast adapter to either CursorAdapter or ArrayAdapter 
ArrayAdapter adapter = (ArrayAdapter)list.getAdapter(); 
adapter.notifyDataSetChanged(); 

You can find out more here.