web-dev-qa-db-fra.com

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. 

24
erdalprinz

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

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

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

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.

0
Erik