2013-01-12 4 views
22

Utworzono ListView (myList) z jednym polem EditText w każdym wierszu (R.id.mannschaften). Pod ListView utworzyłem Button i ustawiłem dla niego OnClickListener w Metodzie OnCreate(). Teraz, po kliknięciu przycisku, chcę wykonać iterację w ListView i uzyskać wartość pola EditText w każdym wierszu i zapisać je na liście-łańcuchów. Ale jak to zrobić?Powtórz przeglądarkę ListView i uzyskaj wartości pola tekstowego

Oto mój kod:

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

już wiem, że to tylko dla getChildAt widocznych wierszy, ale nie wiem jak to zrobić inaczej.

Odpowiedz

16

rozwiązać problem z pomocą znajomego:

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

Próbuję tego kodu, ale et lub odpowiednie pole zawsze zwraca dla mnie wartość null. Wiesz dlaczego? – tejas

+1

Ta linia et = (EditText) v.findViewById (i); rzuca mi null, możesz zgadnąć, dlaczego? – tejas

+1

czy wiesz, dlaczego et = (EditText) v.findViewById (i); wyrzuca zero? – lolliloop

30

Podczas korzystania myList.getAdapter().getView(i,null,null) otrzymujesz nową instancję widoku elementu, spróbuj metody ListView.getChildAt(position) takiego:

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

Ale rozmiar adaptera może się różnić od rozmiaru listy. – Diffy

+1

'myList.getCount()' lub 'myList.getChildCount()'? Ten ostatni wygląda bardziej konsekwentnie – espinchi

0

Odnośnie, dlaczego wybrana odpowiedź może czasami rzucić null na "et = (EditText) v.findViewById (i);"

Czy nie byłoby w tym momencie próby wybrania pozycji na pozycji i W widoku, który wcześniej wybrałeś? Tak więc, jeśli w widokach podrzędnych jest mniej elementów niż na całej liście, otrzymasz wartość null, ponieważ próbuję wybrać elementy, które nie istnieją.

Być może zagnieżdżona pętla może rozwiązać ten problem? Lub jeśli znasz już indeks elementu, którego potrzebujesz, po prostu podaj go bezpośrednio.

4

Myślę, że odpowiedź z @Arius była dość bliska właściwego rozwiązania. Chcę tylko podkreślić, że View powinieneś dostać to View, które zawierają z ListView. Więc musisz getChildAt(position) związane z twoim 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())); 
     } 
    } 
    .... 
} 
Powiązane problemy