2012-10-12 2 views
5

Jak wspomniano pod nr here, funkcja GridView.scrollTo() Androida nie działa. Metoda, o której wspomniało wspomniane rozwiązanie, setSelectedPosition, wydaje się nie istnieć w rzeczywistości, ponieważ działa, ale naprawdę nie chcę animacji.obejścia dla GridView.scrollTo()?

Dla kontekstu, mam CursorAdapter -backed GridView, i chcę, aby widok "zresetować", tj. Przewinąć do góry, kiedy zmieniam kursor.

Odpowiedz

23

Do tej pory używałem setSelection(int position) i wygląda na to, że działa dobrze. Aby przewinąć do góry, po prostu użyj 0 dla pozycji.

Od docs:

Jeśli w trybie dotykowym, element nie zostanie wybrany, ale nadal będzie znajdować się odpowiednio.

Edit: kod Dodany odpowiedzieć setSelection postaci Runnable:

albumsView.post(new Runnable() { 
    @Override 
    public void run() { 
     albumsView.setSelection(0); 
    } 
}); 
+0

Próbowałem tego, bez powodzenia. Czy używasz CursorAdapter? Dzięki i tak. – gatoatigrado

+0

Nie, tylko rozszerzenie BaseAdapter. Próbujesz go przed lub po zmianie kursorów? Nie jestem pewien, czy to robi różnicę, ale potem nie widzę powodu, dla którego używanie CursorAdapter zamiast cokolwiek innego miałoby znaczenie przy przewijaniu. – Geobits

+0

Dobra rozmowa, dziękuję bardzo! Przez długi czas dręczyłem się tym. (dosłownie, godziny i godziny). Wygląda na to, że wystąpił problem podczas wywoływania metody setSelection() i changeCursor(). Kolejność setSelection() i changeCursor nie ma znaczenia (oba kończą się niepowodzeniem, jeśli są wywoływane bezpośrednio w kolejności), ale działa to, aby z powrotem wysłać setSelection() [http://pastebin.com/XmM5jqD3]. Proszę zaktualizować swoją odpowiedź za pomocą tej pasty :) – gatoatigrado

1

I odkryli, że w celu niezawodnego wykorzystać gridView.setSelection (indeks), muszę najpierw zadzwonić GridView. setAdapter() (nawet jeśli adapter został już ustawiony i nie został zmieniony). Podobnie jak:

gridView.setAdapter(gridAdapter); 
gridView.setSelection(index); 
+0

Wywołanie setAdapter zawsze spowoduje pojawienie się przewijania do góry, ponieważ istniejący adapter zostanie usunięty i zastąpiony nowym. Jest to szkodliwe dla wydajności i należy próbować manipulować istniejącym adapterem. – slott

+1

Zły @slott. Jeśli adapter jest już ustawiony, nie spowoduje to zresetowania. Nie powiedziałem nic o utworzeniu nowego adaptera lub usunięciu starego. Powiedziałem jedynie, że z mojego doświadczenia muszę ponownie wywołać setAdapter *, nawet jeśli adapter został już ustawiony *, aby narzędzie setSelection mogło działać niezawodnie. – mikejonesguy

+0

Próbowałem innych podejść tutaj i to jest jedyne, które działało. Ustawiłem filtr na adapterze i chciałem, aby gridview powrócił na górę. Mimo że dane zostały poprawnie zresetowane, obraz czasami pokazywał złe zdjęcie w widoku obrazu. Dzięki @mikejonesguy – bkurzius