2011-10-19 11 views
6

W mojej aplikacji pracuję z ExpandableListView. Używam adaptera, który rozszerza się o BaseExpandableListAdapter. Chcę odświeżyć ExpandableListView.android notifyDataSetChanged for ExpandableListView nie działa

Mój ExpandableListView składa się z elementów z przyciskiem usuwania, który łączy się z bazą danych. Jeśli naciśnie przycisk Usuń, element ten zostanie trwale usunięty z bazy danych. Ale listview nie odświeża się w tym samym czasie. Jeśli ponownie uruchomię tę aktywność, jej odświeżenie, ale nie w tym samym czasie. Używam

mAdapter.notifyDataSetChanged(); 

ale nie działa tak, jak chcę. Dlaczego?

+0

pokazać nam swój kod adaptera? –

+0

czy ponownie zapytałeś "Kursor" również ...? –

+0

jak tylko usunąłem element, ponieważ ten kursor nie jest wymagany. Więc nie używam tego, – Jyosna

Odpowiedz

4

możesz spróbować dodatkowo wywołać invalidateViews() na swoim ExpandableListView podczas odświeżania.

+0

, gdzie to napiszę? bcz chcę, aby na przycisku usuwania kliknij przycisk odświeżania powinien się wydarzyć. – Jyosna

+0

, gdy zmieniła się zawartość twojego ExpandableListView. Po usunięciu pewnej pozycji, na przykład – senola

+0

, ale nie jest dostępna funkcja invalidateViews() – Jyosna

8

Właśnie nazwałem super w poniższej, nadpisanej metodzie BaseExpandableListAdapter i od tego czasu działa funkcja notifyDataSetChanged().

@Override 
    public void registerDataSetObserver(DataSetObserver observer) { 
     super.registerDataSetObserver(observer);  
    } 
+0

Nie wiem, jak ExpandableListAdapter jest interfejsem. –

+0

Myślę, że jest trochę za późno, ale faktycznie użyłem klasy: BaseExpandableListAdapter jako adapter listy .. – Cata

+0

Ahh OK, to miałoby sens, dzięki za aktualizację odpowiedzi. –

0

Trzeba czekać, aż cała viewtree został sporządzony, a następnie można nazwać notifyDataSetChanged()

„Widok drzewo obserwator służy do rejestracji słuchaczy, które mogą być zgłoszone globalnych zmian w Takie globalne zdarzenia obejmują między innymi układ całego drzewa, początek przejścia rysunku, zmianę trybu dotyku ... Serwer ViewTreeObserver nigdy nie powinien być tworzony przez aplikacje, tak jak zapewnia hierarchia widoków. Aby uzyskać więcej informacji, zobacz getViewTreeObserver(). "

http://developer.android.com/reference/android/view/ViewTreeObserver.html

final View v = convertView; 
     ViewTreeObserver vto = convertView.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      public void onGlobalLayout() { 
       v.getViewTreeObserver().removeOnGlobalLayoutListener(this); 

       notifyDataSetChanged();  
}}); 
0

Jeśli używasz rozszerzalna list Big Nerd Ranch, należy pamiętać, że tradycyjne notifyDataSetChanged() z RecyclerView.adapter nie działa.

Zamiast rozszerzalnego RecyclerView oferuje zestaw metod powiadamiania z możliwością informowania adaptera o zmianach na liście ParentListItems.

// Parent Changes 
notifyParentItemInserted(int parentPosition) 
notifyParentItemRemoved(int parentPosition) 
notifyParentItemChanged(int parentPosition) 
notifyParentItemRangeInserted(int parentPositionStart, int itemCount) 

// Child Changes 
notifyChildItemInserted(int parentPosition, int childPosition) 
notifyChildItemRemoved(int parentPosition, int childPosition) 
notifyChildItemChanged(int parentPosition, int childPosition) 

uzyskać dodatkowe specyfiki odwiedzić https://bignerdranch.github.io/expandable-recycler-view/

Powiązane problemy