7

Oto scenariusz: Mam prosty ListView wyświetlający kanał twitter. Mam CursorAdapter, który pobiera tweety z sqlite. Kiedy wywołuję funkcję requery() na moim kursorze, oczekuję, że zostaną pobrane nowe tweety, które zostały dodane do bazy danych. Wszystko działa dobrze, a nowe elementy są nawet widoczne w ListView po tym wydarzeniu.Android ListView z CursorAdapter ma nieprawidłową pozycję przewijania po wywołaniu Requery po dodaniu nowych pozycji

Problem polega na tym, że pozycja przewijania jest zapisywana na podstawie przesunięcia pozycji przedmiotu. Powiedzmy więc, że pierwszą widoczną pozycją w moim ListView jest 4. Kiedy requery i 2 nowe pozycje zostaną dodane do góry listy, ListView utrzymuje pierwszą widoczną pozycję przewijania przedmiotu jako 4, jednak ponieważ na liście są dwie nowe pozycje Teraz widzę inny przedmiot na pozycji 4 niż przed odświeżeniem. Ten obraz ilustruje przed i po: enter image description here

zauważyć jak Przedtem Tweet D to pierwszy widoczny element i potem Tweet B staje teraz pierwszy widoczny element.

Moje pytanie brzmi: w jaki sposób zachować tę samą pozycję przewijania w oparciu o kursor positon podczas wywoływania zamówienia, tak aby w tym przykładzie Tweet był pierwszy widoczny element po zgłoszeniu?

Odpowiedz

0

Moja sugestia to śledzenie liczby pozycji na liście. Gdy już wiesz, że w ramach aktualizacji możesz dodać różnicę między starą liczbą a nową liczbą.

Psuedo Kod

on_update

offset+= (list_view.length() - list_size) 
    list_size = list_view.length() 
3

miałem podobny problem w jednym z moich projektów. Oto jak to rozwiązałem. Chociaż nie jest to dokładnie to samo. Mam nadzieję, że to pomoże.

Przed zaktualizować listę, zapisz pozycję przewijania w ten sposób -

int position = getListView().getFirstVisiblePosition(); 
View v = getListView().getChildAt(0); 
int top = v == null ? 0 : v.getTop(); 

a następnie po aktualizacji listy, będziesz wiedzieć, jak wiele elementów dodanych. Więc można nazwać

yourlistview.setSelectionFromTop(position + <number of items added>, top); 
+0

Główny problem polega na tym, że wszystkie moje przedmioty nie są na tej samej wysokości, więc przewijanie tak nie może uzyskać pozycję „dokładnie” to było na wcześniej, na przykład, jeśli element jest pół widoczny ... – Redth

+0

Spróbowałeś? Ponieważ nawet moja lista zawiera rzędy o zmiennej wysokości. Ale działa idealnie. 'int top = v == null? 0: v.getTop(); 'Ta część faktycznie obsługuje przypadek, gdy element jest w połowie widoczny. – Enigma

Powiązane problemy