Перейдите через 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 из-за того, что я пытаюсь выбрать элементы, которые не существуют.
Возможно, вложенная петля может решить эту проблему? Или, если вы уже знаете индекс элемента, который вам нужен, просто дайте ему индекс напрямую.