2013-05-01 21 views
12

Mam małe pytanie do mojej aplikacji na Androida. Szukałem przez długi czas, ale nie znalazłem nic o moim problemie.Android - Odwróć widok listy jako wyświetlanie wiadomości

Scenariusz: Muszę wyświetlić listę odtwarzania odwrócić (jako Facebook Messenger). A kiedy użytkownik przewinie do góry, załaduj więcej wiadomości.

Problem: Po wywołaniu przewijanie nie jest takie samo! Chcę zachować dokładnie taką samą pozycję jak przed załadowaniem.

Próbowałem ten kod:

// save index and top position 
int index = list.getFirstVisiblePosition()+result.size(); 
View v = list.getChildAt(index); 
int top = (v == null) ? 0 : v.getTop(); 

// ... 
// restore 
list.setSelectionFromTop(index, top); 

Ale przewijania nie jest dokładnie samo po załadunku.

Masz pomysł?

Odpowiedz

35

myślę, że należy patrzeć w użyciu TranscriptMode i StackFromBottom z ListView:

android:stackFromBottom="true" 
android:transcriptMode="normal" 

Ustawiając tryb dialogowej do normy będzie przewijać do dołu tylko wtedy, gdy ostatni element był już w polu widzenia. W ten sposób użytkownicy będą mogli przeglądać poprzednie elementy widoku listy bez przerywania, gdy wywołasz notifydatasetchanged.

+0

Dzięki za pomoc. Nie rozumiem twojego postu. Jeśli znajduję się na pozycji nr 32, po tym, jak zostałem zmieniony, chcę ponownie znaleźć się na pozycji nr 32! Ale teraz, kiedy ta metoda jest wywoływana, nie jestem na tym przedmiocie ... –

+5

Ta odpowiedź jest myląca. 'stackFromBottom' przesuwa (układa) obiekty na dół, nie tworzy kolejności odwrotnej. Obiekty są nadal dodawane od dołu, co nie jest wymagane przez @FlorianMacLanglade (szukam również tego samego rozwiązania). – Diolor

+0

@Diolor ma rację. 'stackfromBottom' to tylko część tego, co chcesz. Druga część to kolejność odwrotna, na którą odpowiedziano: http://stackoverflow.com/questions/10941317/inverted-listview-in-android – Chris

2

Naprawiłem to za pomocą tego samego kodu, co ty, ale aktualizuję zmienną indeksową o liczbę elementów dodawanych do adaptera przed przywróceniem pozycji. Wydaje się, że to wystarczy.

2

zrobić tak:

Collections.reverse(YourList); // ADD THIS LINE TO REVERSE ORDER! 
YourList.notifyDataSetChanged;