Mam pół-skomplikowany problem i mam nadzieję, że ktoś tutaj będzie w stanie mi pomóc.Android: notifyDataSetChanged() nie aktualizuje listview po zmianie orientacji
W przypadku zdarzenia kliknięcia utworzę wątek i rozpocznę długotrwałą operację opartą na metodzie this. Po długo działa zadanie zostanie zakończone, to robi zwrotnego innego sposobu, który dokłada stanowisko do obsługi:
@Override
public void contentSearchModelChanged(Model_ContentSearch csm, ArrayList<Class_Reminder> newRemindersList) {
remindersList = newRemindersList;
mHandler.post(mUpdateDisplayRunnable);
}
który wzywa do Runnable:
// post this to the Handler when the background thread completes
private final Runnable mUpdateDisplayRunnable = new Runnable() {
public void run() {
updateDisplay();
}
};
A oto co mój Metoda updateDisplay() wykonuje:
private void updateDisplay() {
if (csModel.getState() != Model_ContentSearch.State.RUNNING) {
if(remindersList != null && remindersList.size() > 0){
r_adapter = new ReminderAdapater(Activity_ContentSearch.this, remindersList, thisListView);
thisListView.setAdapter(r_adapter);
r_adapter.notifyDataSetChanged();
}
}
}
Działa to pięknie, gdy robię to normalnie. Jeśli jednak zmienię orientację, gdy działa długotrwała operacja, nie działa. Poprawia to wywołanie zwrotne, a parametr przypomnienia ma elementy w nim zawarte. Ale kiedy dojdzie do tej linii:
r_adapter.notifyDataSetChanged();
Nic się nie dzieje. Dziwne jest to, że jeśli wykonam kolejny proces i ponownie uruchomię cały proces (bez zmiany orientacji), to faktycznie aktualizuje on widok dwukrotnie, raz dla poprzedniego przesyłania i znowu dla następnego. Tak więc widok aktualizuje się raz z wynikami pierwszego zgłoszenia, a następnie ponownie z wynikami drugiego zgłoszenia sekundę później. Tak więc adapter DID pobiera dane, po prostu nie odświeża widoku.
Wiem, że to ma coś wspólnego ze zmianą orientacji, ale nie mogę dla mnie zrozumieć dlaczego. Czy ktoś może pomóc? Czy ktoś może zaproponować alternatywną metodę obsługi wątków ze zmianami orientacji?
Bara
Hmm ... to wydaje się bardzo pomocne, ale wydaje się, że nie ma dużo dokumentacji? Nie chciałbym zmienić mojej implementacji na DroidFu i nie wiem jak rozwiązać problem, ponieważ nie jest to "typowy" sposób robienia rzeczy. – Bara
Tak, wygląda na to, że jest to stara opuszczona biblioteka, ale przesłanka wydaje się być dobra. Możesz to zrobić bez korzystania z biblioteki. Zasadniczo obiekt Application śledzi aktywną aktywność (używając onResume). Następnie, gdy jesteś gotowy na powiadomienie adaptera, otrzymasz aktywną aktywność z aplikacji, sprawdź, czy jest to wystąpienie oczekiwanego działania, a jeśli tak, rzuć i powiadom. –
Co to jest kod śledzenia "aktywnej aktywności"? To znaczy, czy powinienem robić coś w stylu CurrentActivity act = new CurrentActivity(); następnie przekazuje akt do klasy Application? – Bara