Staram się używać w Android Application
tej notifyDataSetChanged()
metodzie dla ArrayAdapter
ale to nie działa dla mnie.
Znalazłem tutaj odpowiedź , która notifyDataSetChanged()
powinna działać w głównym wątku, ale nie było na to przykładu.
Czy ktoś mógłby przesłać przykład lub przynajmniej link ?!
Odpowiedzi:
W przypadku
ArrayAdapter
,notifyDataSetChanged
działa tylko w przypadku korzystania zadd()
,insert()
,remove()
iclear()
na zasilaczu.Kiedy
ArrayAdapter
jest konstruowany, przechowuje odniesienie do tego,List
co zostało przekazane. Jeśli miałbyś przekazać element,List
który był członkiem działania, i później zmienić ten element członkowski,ArrayAdapter
nadal zawiera odniesienie do oryginałuList
. Adapter nie wie, że zmieniłeśList
działanie.Masz do wyboru:
ArrayAdapter
modyfikowania podstawowych list (add()
,insert()
,remove()
,clear()
, itd.)ArrayAdapter
z nowymiList
danymi. (Zużywa dużo zasobów i usuwa elementy bezużyteczne).BaseAdapter
iListAdapter
który pozwala na zmianę z podstawowejList
struktury danych.notifyDataSetChanged()
każdym razem, gdy lista jest aktualizowana. Aby wywołać go w wątku interfejsu użytkownika, użyjrunOnUiThread()
ofActivity
. WtedynotifyDataSetChanged()
zadziała.źródło
notifyDataSetChanged()
w ten sposób((BaseAdapter) arrayAdapter).notifyDataSetChanged();
:?Możesz użyć tej
runOnUiThread()
metody w następujący sposób. Jeśli nie używaszListActivity
, po prostu dostosuj kod, aby uzyskać odniesienie do twojegoArrayAdapter
.źródło
Niedawno pisałem na ten temat, choć ten post był stary, pomyślałem, że przyda się komuś kto chce wiedzieć jak wdrożyć
BaseAdapter.notifyDataSetChanged()
krok po kroku i we właściwy sposób.Postępuj zgodnie z instrukcjami Jak poprawnie zaimplementować BaseAdapter.notifyDataSetChanged () w systemie Android lub nowszym blogu BaseAdapter.notifyDataSetChanged () .
źródło
mItem.add()
tego zrobiłem po prostu edycję jednego elementu, co oznacza, żemItem.get(position).setImage(encodedImage)
może to dlatego daje błąd z wyjątkiem NullPointer.Tak więc NotifyDataSetChange działa tylko na edycji, bcz dla karty Array, o której wspomniano powyżej, działa tylko dla add (), clear (), remove () etcMiałem ten sam problem i wolę nie zastępować w sposób ciągły całego ArrayAdapter nowym wystąpieniem. Dlatego mam AdapterHelper do podnoszenia ciężarów gdzie indziej.
Dodaj to w miejscu, w którym normalnie (próbowałbyś) wywołać powiadomienie
Klasa AdapterHelper
źródło
super.addAll(..)
dla API> 11 i super.add (.. ) w połączeniu z iteracji jak twoja:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { super.addAll(items); } else { for (Object o : collection) { super.add(o); } }
. Teraz po prostu rozszerz swoją nową klasę adaptera.Wiem, że to późna odpowiedź, ale miałem podobny problem i udało mi się go rozwiązać, używając
notifyDataSetChanged()
we właściwym miejscu.Więc moja sytuacja wyglądała następująco.
Musiałem zaktualizować widok listy w zakładce paska akcji (fragment) z treścią zwróconą z zupełnie innej aktywności. Początkowo widok listy nie odzwierciedlałby jednak żadnych zmian. Jednak gdy kliknąłem inną kartę, a następnie wróciłem do żądanej karty, widok listy zostałby zaktualizowany o prawidłową treść z innej czynności. Aby rozwiązać ten problem, użyłem
notifyDataSetChanged()
adaptera paska akcji w kodzie działania, które miało zwrócić dane.To jest fragment kodu, którego użyłem w ćwiczeniu.
To działanie zwróciłoby niektóre dane do
FragmentTab2
i bezpośrednio zaktualizowałoby mój widok listy wFragmentTab2
.Mam nadzieję, że ktoś uzna to za przydatne!
źródło