Wpis z mikrobloga

Mireczki, pomóżcie. Mam ListView a w nim 2 checkboxy i edittext. I takich itemów mam np. 30. Wyświetlam je za pomocą BaseAdapter. Wszystko działa ok do momentu, kiedy nie użyję scroola - wtedy wprowadzone zmiany "głupieją" i raz są w 4 itemie, raz w innym. Problem chyba znany - jak go rozwiązać? Docelowo potrzebuję przykładowo dla 30 itemów zapisać 30 pól i do tego aktualnie wykorzystuję listview. Jakieś pomysły?
Myślałem o tym aby dodać watcher do zmiany tekstu w edittext i zapisywać gdzieś zmianę do obiektu, ale nie wiem czy to dobry pomysł.
#androiddev #programowanie
  • 6
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@loginek0: Używasz wzorca ViewHolder? Jeżeli tak, to pewnie źle ustawiasz wartości przy odzyskiwaniu ViewHoldera. Jeżeli nie, pokaż metodę gdzie używasz inflate.

Druga sprawa - zalecane jest używanie RecyclerView zamaist ListView, a jeżeli mimo wszystko bardzo zależy Ci na ListView to obowiązkowo ViewHolder.
  • Odpowiedz
@loginek0: Zastosowanie ViewHoldera powinno naprawić problem. ViewHolder ma zawsze sens - powoduje, że przewijanie listy staje się płynniejsze.

Problemem w Twoim kodzie jest to:

if (convertView == null) {
Co się dzieje jeżeli convertView nie jest nullem? Wtedy modyfikujesz wcześniej utworzony widok a z racji że ustawiasz tylko tekst to checkboxy żyją
  • Odpowiedz
@loginek0: @calc_exe ma rację, to system decyduje, co przekazuje w convertView. Z powodu optymalizacji nie tworzy widoków dla każdego itema w liście, ale ma zachowaną pewną pulę dla elementów widocznych. Jeśli więc przeskrolujesz listę to android przekazuje Ci widok elementu niewidocznego, żebyś wypełnił go danymi, przywrócił stan itd. Ponieważ nigdzie nie zapisujesz stanu checkboxów, dostając widok z jakiegoś niewidocznego elementu, widzisz tym samym zmiany, które na tym widoku zrobiłeś
  • Odpowiedz
@calc_exe: @piszczalka: Ok, coś tam pokombinowałem i zrobiłem coś takiego:
https://pastebin.com/f53kGN3f
Mam jednak dwa problemy - nie wiem jak zapisać zaznaczenie/odznaczenie checkboxa - próbowałem już chyba wszystkiego i nie działa. Wzorowałem się np. na tym, ale również nie działa. Dodatkowo widzę, że jest problem po ponownym kliknięciu na pole z tekstem, że kursor przeskakuje (tutaj o tym pisali). Tak powinna wyglądać implementacja tego viewHoldera? Co robię
  • Odpowiedz