W przypadku części mojej aplikacji użytkownikowi wyświetla się lista nazwisk i jest proszona o pogrupowanie ich według własnego uznania.
(Uwaga: kod ListView został dosłownie skopiowany z samouczka Android Views. Nie dostosowałem go jeszcze do moich potrzeb, po prostu próbuję dowiedzieć się, jak to działa).
Podstawowy układ to LinearLayout, zawierający ScrollView (o nazwie „groupsScrollView” w poniższym kodzie), zawierający RelativeLayout. Mam kilka przycisków i tekst, a następnie mój ListView poniżej, który wyświetla listę nazw. Wszystko to jest wyższe niż widoczny obszar ekranu, więc użytkownik może przewijać w pionie, aby zobaczyć wszystko.
To wszystko działa pięknie, z wyjątkiem tego, że kiedy strona się ładuje, jest zawsze przewijana wstępnie na górę mojego ListView - na środku strony. Utworzony przeze mnie tekst i przyciski, które mówią użytkownikowi, co należy zrobić, nie są widoczne.
Mogę chwycić ekran i przewinąć w górę, to działa dobrze, ale chciałbym, aby ekran załadował się po przewinięciu do góry. Użytkownik nie powinien przewijać W GÓRĘ, aby zobaczyć górę świeżo załadowanej strony. Ale wszystko, co próbowałem programowo przewinąć do góry ekranu, zawiodło.
Oto moja metoda onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.groups);
mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);
//get the Bundle out of the Intent...
Bundle extras = getIntent().getExtras();
mNames = extras.getStringArray("mNames");
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
//This is the line I'm having issues with
mainScrollView.pageScroll(View.FOCUS_UP);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
Toast.LENGTH_SHORT).show();
}
});
}
Problem stanowi wiersz "mainScrollView.pageScroll (View.FOCUS_UP);. Nie powoduje on błędu, ale wydaje się, że nic nie robi. Próbowałem scrollTo (0,0), scrollDirection (View.FOCUS_UP ) i wszystko inne, co przychodzi mi do głowy.
Ponieważ nie pojawia się błąd, muszę założyć, że te polecenia przewijania faktycznie działają, ale przewijają się do góry ListView, a nie do góry ScrollView lub RelativeLayout, który je zawiera. Wydaje się to potwierdzać własny opis metody scrollTo (int x, int y) firmy Google, w którym mówi się: „Ta wersja ogranicza również przewijanie do granic naszego dziecka”.
Aby więc długie pytanie było jeszcze dłuższe, w jaki sposób załadować kilka widoków na ekranie zawartym w ScrollView, a następnie programowo przewijać całość na górę strony, aby użytkownik mógł z nią wchodzić w interakcję?
Dzięki!
źródło
Miałem ten sam problem, prawdopodobnie jakiś błąd.
Nawet odpowiedź
fullScroll(ScrollView.FOCUS_UP)
z drugiej odpowiedzi nie działała.Jedyną rzeczą, która zadziałała, było dzwonienie
scroll_view.smoothScrollTo(0,0)
zaraz po wyświetleniu okna dialogowego.źródło
fullScroll()
, że utrzymuje wybrany element nadal wybrany po przeniesieniu. WfullScroll()
moim przypadku pierwszy element w widoku przewijania był wybierany ponownie za każdym razem, niezależnie od wybranego elementu przed przesunięciem przewijania w górę.Miałem ten sam problem i to go naprawiło. Mam nadzieję, że ci to pomoże.
źródło
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
to działa dobrze, ale tylko problem z tą linią polega na tym, że kiedy dane są zapełniane w scrollViewObject, został wywołany natychmiast. Musisz poczekać kilka milisekund, aż dane zostaną wypełnione. Wypróbuj ten kod:LUB
źródło
Głównym problemem wszystkich tych prawidłowych rozwiązań jest to, że próbujesz przesunąć zwój w górę, gdy nie jest jeszcze narysowany na ekranie.
Musisz poczekać, aż widok przewijania pojawi się na ekranie, a następnie przenieś go do góry za pomocą dowolnego z tych rozwiązań. To lepsze rozwiązanie niż opóźnienie po terminie, ponieważ nie przeszkadza ci opóźnienie.
źródło
onGlobalLayout
wywołania metodyscrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Bardzo łatwe
źródło
onCreate()
.Napotkałem ten sam problem Kiedy używam Scrollview w View Flipper lub Dialog, sprawa
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
zwraca fałsz, więc sprawascrollViewObject.smoothScrollTo(0, 0)
działa dla mniePrzewiń Focus Top
źródło
źródło
źródło
To działa dla mnie
źródło
To jest wymuszone przewijanie w widoku przewijania :
źródło
źródło
Naprawiłem swój problem w Kotlinie w ten sposób:
źródło
źródło