Перейдите через ListView и получите значения EditText-Field

Я создал ListView (myList) с одним полем EditText в каждой строке (R.id.mannschaften). В ListView я создал кнопку и установил для нее OnClickListener в методе OnCreate(). Теперь, когда нажата кнопка, я хочу выполнить итерацию через ListView и получить значение поля EditText в каждой строке и сохранить их в 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 предназначен только для видимых строк, но я не знаю, как это сделать по-другому.

Ответ 1

Решил проблему с помощью друга:

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

Ответ 2

Когда вы используете 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());
    }
....
}

Ответ 3

Я думаю, что ответ от @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()));
        }
    }
    ....
}

Ответ 4

Относительно того, почему выбранный ответ иногда может вызывать нуль на "et = (EditText) v.findViewById(i);"

Не было бы в этот момент пытаться выбрать элемент в позиции я В том случае, если вы ранее выбрали? Таким образом, если в дочерних представлениях меньше элементов, чем есть элементы во всем списке, вы получите null из-за того, что я пытаюсь выбрать элементы, которые не существуют.

Возможно, вложенная петля может решить эту проблему? Или, если вы уже знаете индекс элемента, который вам нужен, просто дайте ему индекс напрямую.