【问题标题】:How to update a spinner dynamically?如何动态更新微调器?
【发布时间】:2010-07-19 17:20:19
【问题描述】:

我一直在尝试在 android 中动态更新我的微调器,但我没有尝试任何工作。

这是我用来更新微调器的以下代码。

typeList = dbAdapter.getList(); //array list with the values

adapter.notifyDataSetChanged();
groupSpinner.postInvalidate();
groupSpinner.setAdapter(adapter);

typeList 的值是正确的,但它们没有在 Spinner 中更新。

【问题讨论】:

  • 我通过创建一个全新的适配器解决了这个问题......我觉得我不应该这样做。
  • 你有一个适配器实例吗?如果你再次初始化你的适配器 notifyDataSetChanged 不起作用。

标签: android android-spinner


【解决方案1】:

实际上,您要么必须在适配器上调用 clear/add,要么创建并设置一个新的适配器。适配器不保留对您列表的引用(它只是在构造时调用您列表上的 toArray),因此它无法自行更新。

dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, newStringList);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerCategory.setAdapter(dataAdapter);

【讨论】:

    【解决方案2】:

    您不能像在其他适配器上那样直接修改原始List 然后调用notifyDataSetChanged(),因为它不会保留原始List

    但是,您可以使用适配器本身实现相同的结果,如下所示:

    spinnerAdapter.clear();
    spinnerAdapter.addAll(updatedListData);
    spinnerAdapter.notifyDataSetChanged(); // optional, as the dataset change should trigger this by default
    

    基于this user392117 的回答。

    编辑:默认情况下,更改列表的方法如add()remove() 会自动调用notifyDataSetChanged()(参见Android Developer Documentation for setNotifyOnChange(boolean)

    public void setNotifyOnChange (boolean notifyOnChange)

    控制改变列表的方法(add, addAll(java.util.Collection), addAll(java.lang.Object[]), insert, remove, clear, sort(java.util.Comparator))是否自动调用通知数据集更改。 如果设置为 false,调用者必须手动调用 notifyDataSetChanged() 以使更改反映在附加视图中。默认为 true,调用 notifyDataSetChanged() 会将标志重置为 true。

    所以你不需要每次都打电话给notifyDataSetChanged()。如果你发现是这种情况,你可以使用 setNotifyOnChange(true)

    spinnerAdapter.setNotifyOnChange(true); //only need to call this once
    spinnerAdapter.add(Object); //no need to call notifyDataSetChanged()
    

    【讨论】:

    • 无需 notifyDataSetChanged() 即可替换整个列表。没有尝试仅添加到现有列表中。我想在这种情况下你可能不得不调用它。
    • 注意:如果您正在扩展 BaseAdapter,您需要将这些方法添加到您的适配器实现中。
    【解决方案3】:

    您只需调用一次 setAdapter() 并调用adapter.notifyDataSetChanged() 来更新数据。

    【讨论】:

    • 我是否需要创建一个全新的适配器,因为它不起作用?当我单击微调器时,列表中的值不会更新。
    • 我发现 NotifyDataSetChanger() 在 Lists 中工作,但我没有看到它在 Spinners 中工作。我想有一些内部差异需要您每次都创建一个新适配器。
    【解决方案4】:

    当您的列表中的数据发生更改以及您想要更新时 然后是微调器

    创建适配器的新对象并将该适配器设置为 微调器。它肯定会起作用。

    祝你好运。

    编辑:您还需要在适配器上调用 notifyDataSetChanged()。

    【讨论】:

      【解决方案5】:

      有错别字吗?这是dbAdapteradapter 之间的区别。如果 Spinner 已经有适配器,则不必重新分配它。此外,您唯一需要做的就是更新适配器并调用notifyDataSetChanged 方法。

      typeList = adapter.getList(); //array list with the values
      // change the values, and then
      adapter.notifyDataSetChanged();
      

      【讨论】:

      • dbAdapter 是我到数据库的链接适配器是我制作的自定义适配器,它扩展了 BaseAdapter 并实现了 SpinnerAdapter。我尝试了你的建议,但没有奏效。
      【解决方案6】:

      在您的适配器上使用 add/remove 并使用 notifyDataSetChanged() 使您不必一遍又一遍地创建新的适配器。

      声明你的全局适配器

      ArrayAdapter<Object> adapter;
      

      当您向适配器所附加的对象列表(字符串或您使用的任何对象)添加一些内容时,向适配器添加一个添加函数并调用 notifyDataSetChanged:

      adaper.add(Object);
      adapter.notifyDataSetChanged();
      

      当您从列表中删除项目时,还添加:

      adapter.remove(Object);
      adapter.notifyDataSetChanged();
      

      编辑:默认情况下,改变列表的方法如 add() 和 remove() 会自动调用 notifyDataSetChanged() (见Android Developer Documentation for setNotifyOnChange(boolean)

      public void setNotifyOnChange (boolean notifyOnChange)

      控制改变列表的方法(add, addAll(java.util.Collection), addAll(java.lang.Object[]), insert, remove, clear, sort(java.util.Comparator))是否自动调用通知数据集更改。 如果设置为 false,调用者必须手动调用 notifyDataSetChanged() 以使更改反映在附加视图中。默认为 true,调用 notifyDataSetChanged() 会将标志重置为 true。

      因此您不需要每次都调用 notifyDataSetChanged()。如果您发现是这种情况,您可以使用 setNotifyOnChange(true)

      adapter.setNotifyOnChange(true); //only need to call this once
      adapter.add(Object); //no need to call notifyDataSetChanged()
      

      【讨论】:

        【解决方案7】:

        更改底层数据并调用适配器上的 notifyDataSetChanged()。

           list.clear();
          list.add("A");
              list.add("B");
          dataAdapter.notifyDataSetChanged();
        

        【讨论】:

          【解决方案8】:

          更改数据后,您需要添加以下代码:

          typeList = dbAdapter.getList()              
          adapter = new ArrayAdapter<String>(v.getContext(),
              android.R.layout.simple_spinner_dropdown_item,typeList);            
          groupSpinner.setAdapter(adapter);
          

          【讨论】:

            【解决方案9】:

            显然在您执行typeList = dbAdapter.getList() 之后,变量typeList 指向不同的列表,而不是您最初提供给适配器的列表,并且适配器会有些混乱。

            所以你应该使用以下代码:

            typeList.clear();
            typeList.addAll(dbAdapter.getList());
            

            【讨论】:

              【解决方案10】:

              设置微调器适配器时添加

              spinnerAdapter.setNotifyOnChange(true);
              

              从那时起,当您添加新数据时,它将自动更新。

              【讨论】:

              • 对于 ArrayAdapter,默认已经是 true。对于与 Spinners 一起使用,这样做没有任何效果 - 正如 cmets 在之前的答案中所提到的那样。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多