【问题标题】:Why can't one add/remove items from an ArrayAdapter?为什么不能从 ArrayAdapter 中添加/删除项目?
【发布时间】:2011-03-29 10:48:15
【问题描述】:

我正在使用ArrayAdapter<CharSequence> 来填充要在android.widget.Spinner 中列出的项目。一切正常。

但现在我想保持项目列表动态,即我希望能够在运行时从选择列表中添加/删除项目。然而,当我调用adapter.add(item)adapter.remove(item) 时,我总是得到UnsupportedOperationException,尽管ArrayAdapter 类的Javadocs 将这两种方法描述为完全可以用于预期目的。

这是一个错误,真的没有实现还是我在这里遗漏了什么?

【问题讨论】:

标签: android android-widget android-2.2-froyo


【解决方案1】:

您可能使用纯 Java 数组(例如,String[])初始化了适配器。尝试使用实现java.util.List 接口的东西(例如ArrayList<String>)。

【讨论】:

  • 我正在使用一个 ArrayList
    ,我得到了UnsupportedOperationException。 Form 是一个自定义类。
  • 使用 Arrays.asList 返回只读 ArrayList 时除外。请参阅下面 Zeratul 的回答
  • 我的首字母是Collections.<String>emptyList(),它也死了。 new ArrayList<String>) 解决了这个问题。
【解决方案2】:

我知道已经晚了,但只是一个简单的解释:这是因为方法 Arrays.asList(T... array) 返回名为 ArrayList 的自定义内部类,它是 只读 >。如前所述,您需要提供完整的 impl。例如java.util.ArrayList.

【讨论】:

    【解决方案3】:

    这里是ArrayAdapter#remove的源代码:

    public void remove(T object) {
        if (mOriginalValues != null) {
            synchronized (mLock) {
                mOriginalValues.remove(object);
            }
        } else {
            mObjects.remove(object);
        }
        if (mNotifyOnChange) notifyDataSetChanged();
    }
    

    唯一可以抛出UnsupportedOperationException 的是else 块中的行。所以问题是您使用的列表不支持删除项目。我的猜测是你正在使用一个数组。例如,尝试一个 ArrayList。

    edit:是的,Mark 所说的...

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,我的数据保存在资源字符串数组中,所以我使用 createFromResource 创建 ArraAdapter。
      以下从资源字符串数组创建 ArrayAdapter 的代码解决了这个问题:

      Resources res = getResources();
      String[] cities = res.getStringArray(R.array.cities_array);
      ArrayAdapter<CharSequence> adapter = new ArrayAdapter(
           this,
           android.R.layout.simple_spinner_item,
           new ArrayList(Arrays.asList(cities)));
      

      【讨论】:

        【解决方案5】:

        在您的适配器类中 - 删除一个项目

        remove(position);
        notifyDataSetChanged();
        

        添加一个项目 -

        adapter.add (newItem);
        adapter.notifyDataSetChanged ();
        

        【讨论】:

        • adapter.remove 需要对象,而不是位置。并抛出java.lang.UnsupportedOperationException
        【解决方案6】:

        您可能在 ArrayAdapter 类中使用 List 而不是 ArrayList

        尝试将您的数组或列表转换为 ArrayList -

        new ArrayList<ClassType>(Arrays.asList(array));
        

        【讨论】:

          【解决方案7】:

          你可以这样试试:

          new ArrayList<>(Arrays.asList(recentlyClient))
          

          示例代码如何实现:

          String[] recentlyClient;
          
          ArrayAdapter<String> recenAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,new ArrayList<>(Arrays.asList(recentlyClient)));
          
          

          【讨论】:

            【解决方案8】:

            我的噩梦是从ArrayAdapter&lt;String&gt; 中删除项目。由于这种现象,我已经避免使用这种方法将近 6 年了:(

            我的适配器是:

             private class MyAdapter extends ArrayAdapter<String> {
                private final Context context;
                private final Bitmap[] slike;
                private final String[] nazivi;
                private final String[] grad_freq;
                private final boolean[] omiljeni;
            
                MyAdapter (Context c, Bitmap[] slike, String[] nazivi, String[] grad_freq, boolean[] omiljeni) {
                    super(c, R.layout.row, R.id.textView1, nazivi);
                    this.context = c;
                    this.slike = slike;
                    this.nazivi = nazivi;
                    this.grad_freq= grad_freq;
                    this.omiljeni = omiljeni;
                }
            // ...
            }
            

            现在,它看起来像:

             private class MyAdapter extends ArrayAdapter<String> {
                private final Context context;
                private final ArrayList<Bitmap> slike;
                private final ArrayList<String> nazivi;
                private final ArrayList<String> grad_freq;
                private final ArrayList<Boolean> omiljeni;
            
                MyAdapter (Context c, ArrayList<Bitmap> slike, ArrayList<String> nazivi, ArrayList<String> grad_freq, ArrayList<Boolean> omiljeni) {
                    super(c, R.layout.row, R.id.textView1, nazivi);
                    this.context = c;
                    this.slike = slike;
                    this.nazivi = nazivi;
                    this.grad_freq= grad_freq;
                    this.omiljeni = omiljeni;
                }
            // ...
            }
            

            当然,删除想要的项目后,一定要调用:

            adapter.notifyDataSetChanged();
            

            在这里感谢您的回答。

            【讨论】:

              猜你喜欢
              • 2015-06-02
              • 1970-01-01
              • 1970-01-01
              • 2010-11-22
              • 2016-07-18
              • 2016-05-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多