1

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

リストが更新されない理由は、データ項目をアダプターに追加していないためです。choicesArraynew 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[]と思いますが、正直なところ、状況によっては、そのパラメーターをすべてスキップして、新しいアイテムを追加する必要があるときはいつでもアイテムをアダプターに直接追加する方が簡単だと思います.

于 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 に答える