【问题标题】:Android - Refresh data in an AlertDialog?Android - 在 AlertDialog 中刷新数据?
【发布时间】:2012-02-11 04:41:22
【问题描述】:

所以,如果我像这样创建一个 AlertDialog:

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

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

【问题讨论】:

    标签: java android android-alertdialog


    【解决方案1】:

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

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

    希望对您有所帮助。如果没有,请告诉我。

    DSC

    【讨论】:

    • 在使用这些对话框时,我还是个新手。我应该将 DialogInterface.OnClickListener 保留为 OnClickListener,还是像使用普通 Listview 一样使用 View.OnClickListener?
    • 我有点愚蠢,问我什么时候可以尝试一下。看起来 DialogInterface.OnClickListener 是要走的路。
    【解决方案2】:

    如果你和我一样,并且想使用默认适配器,例如多选项目,那么还有一种方法。

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

    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.

    【讨论】:

      【解决方案3】:

      这就是我在 Kotlin 中的做法:

      AlertDialog.Builder(context).apply {
         val actions = arrayListOf("aa", "bb")
         val onItemClickListener = DialogInterface.OnClickListener { dialog, which ->
             // code
         }
         val adapter = ArrayAdapter(requireContext(), 
             android.R.layout.simple_list_item_1, actions)
         setAdapter(adapter, onItemClickListener)
      
         executeGetRequest() {
            actions.add("cc")
            adapter.notifyDataSetChanged()
         }
      }.show()
      

      【讨论】:

        猜你喜欢
        • 2019-01-28
        • 2020-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多