2013-01-12 11 views
22

Ho creato un ListView (mylist) con un campo EditText in ogni riga (R.id.mannschaften). Sotto ListView, ho creato un pulsante e impostato un OnClickListener nel metodo OnCreate(). Ora, quando si fa clic sul pulsante, voglio scorrere il ListView e ottenere il valore del campo EditText in ogni riga e salvarli in un elenco di stringhe. Ma come faccio?Iterate tramite ListView e ottenete i valori del campo EditText

Ecco il mio codice:

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

so già, che getChildAt è solo per le righe visibili, ma non so come farlo in modo diverso.

risposta

16

risolto il problema con l'aiuto di un amico:

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

Sto provando questo codice ma il campo et o relativo restituisce sempre null per me. Sai perché? – tejas

+1

Questa riga et = (EditText) v.findViewById (i); mi getta nulla, puoi indovinare perché? – tejas

+1

sai perché et = (EditText) v.findViewById (i); getta nulla? – lolliloop

30

Quando si utilizza myList.getAdapter().getView(i,null,null) hai trovato una nuova istanza della vista oggetto, provare il metodo ListView.getChildAt(position) in questo modo:

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

Ma la dimensione dell'adattatore può essere diversa dalla dimensione listview. – Diffy

+1

'myList.getCount()' o 'myList.getChildCount()'? Quest'ultimo sembra più coerente – espinchi

0

Per quanto riguarda il motivo per cui la risposta selezionata a volte può generare un null su "et = (EditText) v.findViewById (i);"

Non sarebbe a quel punto cercando di selezionare l'articolo in posizione I ENTRO la vista che avevi precedentemente selezionato? Pertanto, se ci sono meno elementi nelle viste secondarie rispetto a quelli presenti nell'intero elenco, si otterrà nulla a causa del tentativo di selezionare elementi che non esistono.

Forse un ciclo nidificato potrebbe risolvere questo problema? O se conosci già l'indice dell'elemento di cui hai bisogno, dagli semplicemente l'indice direttamente.

4

Penso che la risposta di @Arius fosse abbastanza vicina per essere la soluzione giusta. Voglio solo evidenziare che View si dovrebbe ottenere è View che contengono con ListView. Quindi hai bisogno di getChildAt(position) collegato al tuo 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())); 
     } 
    } 
    .... 
} 
Problemi correlati