26

各行に 1 つの EditText-Field を持つ ListView (myList) を作成しました (R.id.mannschaften)。ListView の下で、ボタンを作成し、OnCreate() メソッドで OnClickListener を設定しました。Button がクリックされたら、ListView を反復処理し、すべての行で EditText-Field の値を取得して、String-List に保存します。しかし、どうすればそれを行うことができますか?

ここに私のコードがあります:

private void ButtonClick() {
    /** get all values of the EditText-Fields */
    View v;
    ArrayList<String> mannschaftsnamen = new ArrayList<String>();
    EditText et;

    for (int i = 0; i < myList.getCount(); i++) {
        v = myList.getChildAt(i);
        et = (EditText) v.findViewById(R.id.mannschaften);
        mannschaftsnamen.add(et.getText().toString());
    }
    .....
}

getChildAt は表示されている行のみを対象としていることは既に知っていますが、別の方法で行う方法はわかりません。

4

4 に答える 4

35

myList.getAdapter().getView(i,null,null)item ビューの新しいインスタンスを取得する場合は、次のような方法を試してくださいListView.getChildAt(position)

private void ButtonClick() {
    /** get all values of the EditText-Fields */
    View v;
    ArrayList<String> mannschaftsnamen = new ArrayList<String>();
    EditText et;
    for (int i = 0; i < myList.getCount(); i++) {
        v = myList.getChildAt(i);
        et = (EditText) v.findViewById(R.id.editText1);
        mannschaftsnamen.add(et.getText().toString());
    }
....
}
于 2014-04-21T15:26:45.737 に答える
20

友人の助けを借りて問題を解決しました:

private void ButtonClick() {
    /** get all values of the EditText-Fields */
    View v;
    ArrayList<String> mannschaftsnamen = new ArrayList<String>();
    EditText et;
    for (int i = 0; i < myList.getCount(); i++) {
        v = myList.getAdapter().getView(i, null, null);
        et = (EditText) v.findViewById(i);
        mannschaftsnamen.add(et.getText().toString());
    }
....
}
于 2013-01-13T11:53:58.910 に答える
7

@Ariusからの答えは、正しい解決策にかなり近かったと思います。Viewを取得する必要があることを強調したいだけViewですListView。だからあなたはあなたとgetChildAt(position)関連付ける必要がありますListView

private void ButtonClick() {
/** get all values of the EditText-Fields
find your ListView local variable you had created for example :
private ListView listview; 
You also need to catch null value of EditText first. */
ArrayList<String> mannschaftsnamen = new ArrayList<String>();
EditText et;
    for (int i = 0; i < listview.getCount(); i++) {
        et = (EditText) listview.getChildAt(i).findViewById(R.id.editText1);
        if (et!=null) {
           mannschaftsnamen.add(String.valueOf(et.getText()));

           /** you can try to log your values EditText */
           log.v("ypgs", String.valueOf(et.getText()));
        }
    }
    ....
}
于 2014-06-16T02:19:02.520 に答える
0

選択した回答が「et = (EditText) v.findViewById(i);」で null をスローすることがある理由について

その時点で、以前に選択したビュー内の位置 i にあるアイテムを選択しようとしていませんか? したがって、子ビューの項目がリスト全体の項目よりも少ない場合、存在しない項目を選択しようとしたために null が返されます。

おそらく、ネストされたループでこの問題を解決できるでしょうか? または、必要な要素のインデックスが既にわかっている場合は、インデックスを直接指定します。

于 2014-05-19T13:17:15.517 に答える