Wpis z mikrobloga

Odświeża ktoś listview kilkanaście razy na sekundę? Przy odświeżaniu powiedzmy raz na sekundę jest ok, ale przy kilkudziesięciu - mam błąd w konsoli developerskiej: java.lang.IllegalStateException at android.widget.ListView.layoutChildren (ListView.java:1747) itd.
Oczywiście mam wszystko aktualizowane po runOnUiThread.

#androiddev
  • 15
@loginek0: Po pierwsze pytam z ciekawości, czemu odświeżasz kilkanaście razy na sekundę?

A po drugie też użyłbym RecyclerView. Najlepiej w tle możesz sobie zrobić diffUtil, wywołać notifyXXX tylko dla tego, co się zmieniło i ewentualnie jeśli są to niewielkie zmiany w stosunku do elementu listy (np. zmienia się tylko wartość liczbowa, a cały element to rozbudowany layout z wieloma elementami) możesz dodatkowo w diffUtil zrobić getChangePayload, które potem przekazujesz do Adaptera.
@SmallStepsToBordo: @another_throwaway23: @Alpha_Male: Mam aplikację, która wykorzystuje Bluetooth 4.0 i mam około 200 urządzeń, które wysyłają sygnały na przemian. Stąd w jednej sekundzie mogę mieć tych aktualizacji kilkadziesiąt a potrzebuję to wyświetlić na liście.
Ten RecyclerView jest dużo lepszy/szybszy od ListView? Tak naprawdę nie potrzebuję "fajerwerków", które on ma. Dla wyświetlenia zwykłej listy sądziłem, że ListView będzie lepszy - tym bardziej, że aplikacja musi mieć wsparcie Androida od 4.3.
@loginek0 rv jest w supporcie od bardzo niskich api, na pewno wspiera 4.3. ale obawiam się że też ci nie pomoże przy takim podejściu. rozsądna opcją wydaje sie być buforowanie zdarzeń i robienie zbiorczej aktualizacji listy co określony interwał (np 200ms)
@another_throwaway23: Array_list edytuję tylko dla tych elementów, które potrzebuję ale i tak na końcu wywołuję:
adapter.notifyDataSetChanged();

Chyba faktycznie będę musiał napisać sobie jakiś osobny wątek, który będzie co x ms sprawdzał czy dane się zmieniły i ewentualnie odświeżał...
@mdfk: @nocneszczury: @another_throwaway23: @Alpha_Male: @SmallStepsToBordo: Ok, zrobiłem teraz tak, że odpalam Handler Runnable co 300ms i aktualizuję za pomocą runOnUiThread adapter - notifyDataSetChanged. Lista już nie wiesza się tak jak wcześniej - jest ok. Wszystko działa super do momentu, aż użytkownik nie wciśnie cokolwiek na liście - wtedy wywala błąd:

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure
@mdfk: Aleś się uparł na ten RV :D Skoro nie wykorzystam jego możliwości to po co przechodzić? Nie potrzebuję siatki itd. Jeśli nie było RV to jak programiści radzili sobie ze zwykłym listview? Mi sam LV wystarcza w 100%, tylko te głupie błędy przy aktualizacji adaptera...
@loginek0: Recycler to nie tylko siatka, ale też sposób w jaki te dane odświeża. Zresztą ktoś tam wyżej mówił, że możesz to spiąć z DiffUtil.

Wracając do Twojego pytania, to zamykasz tam to Runnable jak użytkownik coś klika? bo zamkniesz widok listy a on sobie może chodzić cały czas i próbować odświeżać widok