【问题标题】:UnsupportedOperationException while adding a string to a list through ArrayAdapter通过 ArrayAdapter 将字符串添加到列表时出现 UnsupportedOperationException
【发布时间】:2013-07-06 14:24:37
【问题描述】:

我在这里要做的是在按下软键上的“Enter/Done”时添加当前在 EditText 中的单词。但是,每次我按软键上的“Enter/Done”时,应用程序都会崩溃。

我尝试进行一些调试,似乎问题出在 adapter.add(v.getText().toString());线。我不知道为什么/如何!!

  public boolean onEditorAction(TextView v,int actionId, KeyEvent event)    {
  Log.d("InThere","in onEditorAction1");
  if((event==NULL) || (event.getAction()==KeyEvent.ACTION_UP))
  {
     if(event==NULL)
     Log.d("InThere","inside if+EVENT");
     if(event.getAction()==KeyEvent.ACTION_UP)
    Log.d("InThere","inside if+ACTION_UP");
     Log.d("InThere","before adapter ");
         adapter.add(v.getText().toString());      <<<cause of error ?
     Log.d("InThere","after adapter ");
     v.setText("");

     InputMethodManager imm=(InputMethodManager)
     getSystemService(INPUT_METHOD_SERVICE);
     imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
  }

  Log.d("InThere","in onEditorAction2");
  return true; 

}

我创建了一个带有“InThere”标签的过滤器,它在 LogCat 中是这样的:

InThere         in onEditorAction1
InThere         in onEditorAction2
InThere         in onEditorAction1
InThere         inside if+ACTION_UP
InThere         before adapter

另外,你能帮我理解为什么字符串是通过 onEditorAction 函数中的 TextView 实例获取的,而实际上它实际上是从 EditText 获取的?

[更新]

这是代码的声明部分......

private final static String[] items={"this","is","a","really","silly","list"};
 private static final KeyEvent NULL = null;
   private ArrayList<String> words=null;
    private ArrayAdapter<String> adapter;

    public void onCreate(Bundle icicle) 
    {
        super.onCreate(icicle);
        words = new ArrayList<String>();
        for(String s: items)
        {
            words.add(s); 
        }
        adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items);
        setListAdapter(adapter);

    }

【问题讨论】:

  • 什么是适配器类?
  • 是的,什么是适配器类?还要检查您的 LogCat 的堆栈跟踪,即要读取的导入日志!会告诉你确切的错误
  • @Blundell 或@Wand Maker:哦!很抱歉。它被声明为private ArrayAdapter&lt;String&gt; adapter; 在同一个类中,即 MainActivity.java
  • 使用包含 items 值的ArrayList 并将其传递给ArrayAapter。否则,适配器将从您传入的数组中创建一个不可变列表,其中 add/remove 方法不起作用并抛出您看到的错误。

标签: android runtime-error android-arrayadapter


【解决方案1】:

是的,怀疑是,您的 ArrayAdapterarray 支持。

Array 不支持添加操作。

将其更改为由 ArrayList 返回。即:

private final static List<String> items = new ArrayList();
static {
  items.add("this");
  items.add("is");
  items.add("a");
  items.add("really");
  items.add("silly");
  items.add("list");
}

正如 WandMaker 所暗示的,您似乎已经做了一些工作来创建 ArrayList,另一种解决方案可能是:

 adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, words);

最佳解决方案(使用您的代码)是:

public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        List<String> words = new ArrayList<String>();
        words.add("this");
        words.add("is");
        words.add("a");
        words.add("really");
        words.add("silly");
        words.add("list");
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, words);
        setListAdapter(adapter);
    }

【讨论】:

  • 我不明白你的回答。它在哪里由数组支持?他有 words = new ArrayList();
  • @WandMaker 不需要 -1 只是因为 不明白。在他的问题中,它由一个数组支持:new ArrayAdapter&lt;String&gt;(this,android.R.layout.simple_list_item_1,items);
  • 但是您的解决方案不必要地要求创建一个静态变量。您可以通过告诉他将“单词”作为参数而不是“项目”传递来解决答案,我已删除 -1,但您的解决方案不正确。
  • @WandMaker 他的问题是静态的!
  • @Blundell 谢谢,现在可以了。在我阅读了您的 “另一种解决方案” 部分后,我恍然大悟……所以根据我现在的理解,array 不能 传递给ArrayAdapter因为它的大小不能在runtime 处增加,对吗?
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2016-08-06
相关资源
最近更新 更多