android - Iterar a través de ListView y obtener valores EditText-Field
android-edittext (4)
Creé un ListView (myList) con un EditText-Field en cada fila (R.id.mannschaften). Debajo de ListView, he creado un botón y configurado un OnClickListener para él en el método OnCreate (). Ahora, cuando se hace clic en el botón, quiero iterar a través de ListView y obtener el valor del EditText-Field en cada fila y guardarlos en una String-List. ¿Pero cómo hago eso?
Aquí está mi Código:
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());
}
.....
}
Ya sé que getChildAt es solo para las filas visibles, pero no sé cómo hacerlo de manera diferente.
Creo que la respuesta de @Arius estuvo bastante cerca de ser la solución correcta. Solo quiero resaltar que View
que debe obtener es View
que contiene ListView
. Entonces necesita getChildAt(position)
relacionado con su 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()));
}
}
....
}
Cuando utiliza myList.getAdapter().getView(i,null,null)
obtiene una nueva instancia de la vista de elemento, pruebe el método ListView.getChildAt(position)
esta manera:
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());
}
....
}
En cuanto a por qué la respuesta seleccionada a veces arroja un nulo en el "et = (EditText) v.findViewById (i);"
¿No sería en ese momento cuando intente seleccionar el artículo en la posición i DENTRO de la vista que había seleccionado previamente? Por lo tanto, si hay menos elementos en las vistas secundarias que elementos en la lista completa, se anulará debido a que intento seleccionar elementos que no existen.
Tal vez un ciclo anidado podría resolver este problema? O si ya conoce el índice del elemento que necesita, simplemente dele el índice directamente.
Resolvió el problema con la ayuda de un amigo:
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());
}
....
}