web-dev-qa-db-ja.com

ListViewを反復処理し、EditText-Field値を取得します

各行に1つのEditText-Fieldを持つListView(myList)を作成しました(R.id.mannschaften)。 ListViewの下で、ボタンを作成し、OnCreate()メソッドでOnClickListenerを設定しました。次に、ボタンをクリックすると、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は表示されている行専用であることは既に知っていますが、それをどうやって変えるかはわかりません。

26
erdalprinz

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

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());
    }
....
}
19
erdalprinz

myList.getAdapter().getView(i,null,null)を使用する場合、アイテムビューの新しいインスタンスを取得するには、次のような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());
    }
....
}
34
Mohamed F

@Ariusからの答えは正解に近いと思います。 Viewを含むViewListViewを含むことを強調したいだけです。したがって、ListViewに関連するgetChildAt(position)が必要です。

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()));
        }
    }
    ....
}
7
nang_kring

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

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

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

0
Erik