2013-03-06 60 views
1

我正在使用包含用户输入的字符串的ListView的程序。我希望它在用户单击按钮后列出每个字符串。此外,我希望ListView中显示的每个字符串值也位于数组中,以便稍后可以处理列表。这就是我现在所拥有的:添加新String到列表中,你只需要使用您的适配器,它告诉适配器更新的notifyDataSetChanged()正在更新ListView

FATAL EXCEPTION: main 
java.lang.UnsupportedOperationException 
at java.util.AbstractList.add(AbstractList.java:404) 
at java.util.AbstractList.add(AbstractList.java:425) 
at android.widget.ArrayAdapter.add(ArrayAdapter.java:179) 
at MainActivity$1.onClick(MainActivity.java:38) 
+0

什么是变量'选择'你似乎没有在你发布的代码中声明它。 – FoamyGuy 2013-03-06 20:11:54

+0

道歉,我编辑它。这是一个类变量 – 2013-03-06 20:28:00

+0

好吧,我编辑我的答案与您需要修复它的信息。我将再次编辑您的帖子以添加您移除的标签。请让他们有这个时候,使用特定的标签保留本网站举办的,它给你一个更好的机会得到来自人的答案,因为很多人“最喜欢”的标签,他们在 – FoamyGuy 2013-03-06 21:57:05

回答

1

您的列表不更新的原因是,你是不是曾经将您的数据项的适配器。您只将它们添加到choicesArray这是您传递给新的ArrayAdapter()构造函数的数组。

该构造函数不适配器绑定到数组,但基本上复制到阵列的适配器(在你调用构造函数的时间)后到阵列的变更不会在一个ArrayAdapter中反映出来。

我喜欢这样认为ArrayAdapter <>与ArrayList <>基本上是一样的,并且可以为某些AdpaterView父项生成子视图。您可以将它传递给array[]以开始,它将使用该数组中的值进行初始化,但它不会将数组链接到适配器或ListView。在最初的构造函数调用之后,任何一个变化都不会反映在另一个变体中。

所以,你应该改变你的代码看起来像这样:

addButton.setOnClickListener(new View.OnClickListener() { 

    public void onClick(View v) { 
     EditText editText = (EditText) findViewById(R.id.edit_choice); 
     String message = editText.getText().toString(); 
     adapter.add(message); 

     //adapter.notifyDataSetChanged(); //<-- you might need to call this, but I think it might work without if you do it this way. 
     //listView.setAdapter(adapter); //<-- you shouldn't need to call this each time. Once at the begining is enough. 
    } 
}); 

编辑:

改变你的ArrayAdapter的构造和删除choiceArray参数,所以你应该会留下这样的:

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

之后,我认为你应该很好去。本质上,问题在于,由于您传递的是数组,因为数组的大小是固定的(您的长度为1),所以不允许添加任何内容。如果你愿意,我怀疑你可以使用ArrayList<String>而不是String[],但对于你的情况,我认为只要跳过这个参数并直接添加项目到你的适配器将会更容易,只要你需要添加新的。

+0

添加语句adapter.add(消息)的字符串;创建一个强制关闭应用程序的错误 – 2013-03-06 21:24:51

+0

编辑你的问题,并包含stacktrace的相关部分,它显示了什么是异常。 – FoamyGuy 2013-03-06 21:27:34

+0

我编辑了我的问题,谢谢你的建议,我习惯了这个网站上的礼仪! – 2013-03-06 21:40:19

0

public ArrayList<String> choices = new ArrayList<String>(); 
public String[] choicesArray; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final ListView listView = (ListView) findViewById(R.id.listView1); 
    choicesArray = new String[] { "You have not entered a choice yet" }; 
    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, android.R.id.text1, 
      choicesArray); 
    listView.setAdapter(adapter); 

    final Button addButton = (Button) findViewById(R.id.Button1); 
    addButton.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      EditText editText = (EditText) findViewById(R.id.edit_choice); 
      String message = editText.getText().toString(); 
      adapter.add(message); 

      //choices.add(message); 
      //choicesArray = choices.toArray(choicesArray); 

      //listView.setAdapter(adapter); 
     } 
    }); 
} 

此代码创建一个错误显示,它会用新的字符串

addButton.setOnClickListener(new View.OnClickListener() { 

    public void onClick(View v) { 

     EditText editText = (EditText) findViewById(R.id.edit_choice); 
     String message = editText.getText().toString(); 
     choices.add(message); 
     choicesArray = choices.toArray(choicesArray); 

     adapter.notifyDataSetChanged(); 

    } 
}); 

更新更新ListView

你应该考虑这种变化太

choicesArray = new String[choices.size()]; 
choicesArray = choices.toArray(choicesArray); 
+0

答案听起来不错,但为什么更新?看起来你只是无缘无故地创建一个新的String [],因为你立即重新分配它。 – Geobits 2013-03-06 20:37:26

+0

我基本上要添加的字符串值到现有数组列表(其必须被转换到一个数组),并且具有数组列表在列表视图中被显示。添加adapter.notifyDataSetChanged();声明没有帮助,并且更新导致我的程序根本不工作 – 2013-03-06 20:43:03

+0

你得到了什么样的异常? – 2013-03-06 21:00:34