Itérez via ListView et obtenez les valeurs EditText-Field
J'ai créé un ListView (myList) avec un EditText-Field dans chaque ligne (R.id.mannschaften). Sous ListView, j'ai créé un bouton et défini un OnClickListener dans la méthode OnCreate () . Désormais, lorsque le bouton est cliqué, je souhaite parcourir le ListView et obtenir la valeur du champ EditText. dans chaque ligne et enregistrez-les dans une liste de chaînes. Mais comment je fais ça?
Voici mon code:
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());
}
.....
}
Je sais déjà que getChildAt concerne uniquement les lignes visibles, mais je ne sais pas comment le faire différemment.
Résoudre le problème avec l'aide d'un ami:
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());
}
....
}
Lorsque vous utilisez myList.getAdapter().getView(i,null,null)
, vous obtenez une nouvelle instance de la vue d'élément, essayez la méthode ListView.getChildAt(position)
comme ceci:
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());
}
....
}
Je pense que la réponse de @Arius était assez proche pour être la bonne solution. Je veux juste souligner que View
vous devriez obtenir est View
qui contient avec ListView
. Donc, vous devez associer getChildAt(position)
à votre 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()));
}
}
....
}
En ce qui concerne la raison pour laquelle la réponse sélectionnée peut parfois renvoyer une valeur null sur "et = (EditText) v.findViewById (i);"
Ne serait-ce pas à ce moment-là d'essayer de sélectionner l'élément à la position i DANS la vue que vous aviez précédemment sélectionnée? Ainsi, s'il y a moins d'éléments dans les vues enfants que d'éléments dans la liste entière, vous obtenez une valeur nulle si je tente de sélectionner des éléments qui n'existent pas.
Peut-être qu'une boucle imbriquée pourrait résoudre ce problème? Ou si vous connaissez déjà l'index de l'élément dont vous avez besoin, donnez-lui simplement l'index.