1

我正在开发一个使用 a 的程序,ListView其中包含用户输入的字符串。我希望它在用户单击按钮后列出每个字符串。此外,我希望在 中显示的每个字符串值ListView也都在一个数组中,以便我以后可以操作该列表。这就是我现在所拥有的:

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);
        }
    });
}

此代码会产生错误:

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)
4

2 回答 2

1

您的列表未更新的原因是您从未将数据项添加到适配器。您只是将它们添加到choicesArray您传递给 new 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),因此不允许您添加任何内容。我怀疑您可能可以根据需要使用 anArrayList<String>而不是String[],但老实说,对于您的情况,我认为在需要添加新参数时直接跳过该参数并直接将项目添加到适配器会更容易。

于 2013-03-06T21:02:59.787 回答
0

将新的添加String到您的列表后,您只需使用notifyDataSetChanged()您的适配器,它告诉适配器更新显示,它将ListView使用新字符串更新

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();

    }
});

更新

您也应该考虑进行此更改

choicesArray = new String[choices.size()];
choicesArray = choices.toArray(choicesArray);
于 2013-03-06T20:11:07.997 回答