2011-12-14 17 views
7

Mam skonfigurować ListView, który zawiera pole wyboru w każdym wierszu (wraz z TextView). Z jakiegoś powodu, kiedy "sprawdzam" jedno z pól, wydaje mi się, że "sprawdza", którekolwiek pole jest przeciwne w ListView (tj. Po wybraniu top boxa, dolne pole wyboru staje się zaznaczone, podczas gdy góra pozostaje niezaznaczona,Checkboxes w ListView - Kiedy wybieram pierwszy, sprawdza ostatni i vice versa

Zdaję sobie sprawę, że nie ma tutaj żadnego kodu, ale zastanawiałem się, czy to jest ogólny problem, a jeśli nie, mogę spróbować napisać kod. Dzięki!

+0

Wyślij swój kod na adapter ListView i zasobów xml – Spidy

+1

Prawdopodobnie powinien opublikować jakiś kod, ale rzeczywiście istnieje wspólny ogólny problem (nie błąd, ale projekt, którego wielu nowych użytkowników na Androida nie zdajemy sobie z tego sprawy), z którym najprawdopodobniej korzystasz, ponieważ sposób, w jaki Android ListViews ponownie wykorzystuje Widoki, zapobiega nadmiernemu tworzeniu obiektów i usuwaniu śmieci. – kabuko

+0

Moim celem jest stworzenie menu, które pojawi się (jak na Gmail), gdy użytkownik wybierze jedno lub więcej pól wyboru. Nie jestem pewien, jak zdecydować, które fragmenty kodu zamieścić, ale kiedy wyjmę moje metody, które wywołują moje "menu" na dole, problem znika. Jakieś pomysły na temat sposobu usuwania śmieci? – jonstaff

Odpowiedz

4

Widoki są przetwarzane w widoku listy. dlaczego niektóre są sprawdzane, gdy myślisz, że nie powinieneś.

Oto oferta: pole wyboru ma nie ma pojęcia który element w swoim adapterze reprezentuje. To po prostu pole wyboru z rzędu w ListView. Musisz zrobić coś, aby "nauczyć" wierszy, których element w zestawie danych aktualnie wyświetla. Zamiast więc używać czegoś tak prostego jak tablica łańcuchów jako danych dla adaptera, utwórz nowy obiekt modelu, który przechowuje stan tego pola wyboru. Następnie, zanim zwróci wiersz getView(), można zrobić coś takiego:

//somewhere in your class 
private RowData getData(int position) { 
return(((MyAdapter)getListAdapter()).getItem(position)); 
} 



//..then in your adapter in getView() 

    RowData object = getModel(position); 

    if(object.isChecked()) { 
     myCheckbox.setChecked(true); 
    } else { 
     myCheckbox.setChecked(false); 
     } 

    //then retun your view. 
+0

Dziękuję za odpowiedź. Mój ListAdapter znajduje się w metodzie fillData() w zupełnie innej klasie. Czy to źle? – jonstaff

+0

@ jstaff107, nie, możesz mieć swój adapter w dowolnym miejscu. – LuxuryMode

+0

Nie jestem do końca pewien, skąd pochodzi klasa "RowData"? – jonstaff

Powiązane problemy