Für einen Teil meiner App wird dem Benutzer eine Liste mit Namen angezeigt, und er wird aufgefordert, diese nach Bedarf zu gruppieren.
(Beachten Sie, der ListView-Code wurde wortwörtlich aus dem Android-Ansichten-Tutorial kopiert. Ich habe ihn noch nicht an meine Bedürfnisse angepasst. Ich versuche nur herauszufinden, wie das funktioniert.)
Das grundlegende Layout ist ein LinearLayout, das eine ScrollView enthält (im folgenden Code "groupsScrollView" genannt), die ein RelativeLayout enthält. Ich habe ein paar Schaltflächen und Text, und darunter meine ListView, die die Liste der Namen anzeigt. Dies alles ist größer als der sichtbare Bildschirmbereich, sodass der Benutzer vertikal scrollen kann, um alles zu sehen.
Dies funktioniert alles wunderbar, außer wenn die Seite geladen wird, wird sie immer an den Anfang meiner ListView gescrollt - in der Mitte der Seite. Der von mir erstellte Text und die Schaltflächen, die dem Benutzer mitteilen, was zu tun ist, sind nicht sichtbar.
Ich kann den Bildschirm greifen und nach oben scrollen, das funktioniert gut, aber ich möchte, dass der Bildschirm bereits nach oben gescrollt wurde. Der Benutzer sollte nicht nach oben scrollen müssen, um den Anfang einer frisch geladenen Seite zu sehen. Aber alles, was ich versucht habe, programmgesteuert zum oberen Rand des Bildschirms zu scrollen, ist fehlgeschlagen.
Hier ist meine onCreate-Methode:
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();
}
});
}
Die Zeile "mainScrollView.pageScroll (View.FOCUS_UP)" ist das Problem. Es verursacht keinen Fehler, scheint aber nichts zu tun. Ich habe scrollTo (0,0), scrollDirection (View.FOCUS_UP) ausprobiert ) und alles andere, woran ich denken kann.
Da ich keine Fehlermeldung bekomme, muss ich davon ausgehen, dass diese Scroll-Befehle tatsächlich funktionieren, aber sie scrollen zum oberen Rand der ListView und nicht zum oberen Teil des ScrollView oder RelativeLayout, das sie enthält. Dies scheint durch Googles eigene Beschreibung der scrollTo (int x, int y) -Methode bestätigt zu werden, in der sie sagen: "Diese Version klemmt auch das Scrollen an die Grenzen unseres Kindes."
Um eine lange Frage noch länger zu stellen: Wie lade ich eine Reihe von Ansichten auf den in einer ScrollView enthaltenen Bildschirm und scrolle dann das Ganze programmgesteuert an den Anfang der Seite, damit der Benutzer damit interagieren kann?
Vielen Dank!
Versuchen
mainScrollView.fullScroll(ScrollView.FOCUS_UP);
es sollte funktionieren.
Hatte das gleiche Problem, wahrscheinlich eine Art Fehler.
Sogar die fullScroll(ScrollView.FOCUS_UP)
von der anderen Antwort hat nicht funktioniert .
Das einzige, was für mich funktionierte, war scroll_view.smoothScrollTo(0,0)
direkt nachdem der Dialog angezeigt wurde.
ich hatte das gleiche Problem und dieses Problem wurde behoben. Ich hoffe es hilft dir.
listView.setFocusable(false);
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
dies funktioniert gut, aber das Problem bei dieser Zeile ist nur, dass, wenn Daten in scrollViewObject gefüllt werden, dieser sofort aufgerufen wurde. Sie müssen einige Millisekunden warten, bis die Daten gefüllt sind. Versuchen Sie diesen Code:
scrollViewObject.postDelayed(new Runnable() {
@Override
public void run() {
scroll.fullScroll(ScrollView.FOCUS_UP);
}
}, 600);
OR
scrollViewObject.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
scrollViewObject.getViewTreeObserver().removeOnGlobalLayoutListener(this);
scrollViewObject.fullScroll(View.FOCUS_UP);
}
});
Das Hauptproblem aller gültigen Lösungen ist, dass Sie versuchen, die Bildlaufleiste nach oben zu verschieben, wenn sie noch nicht auf dem Bildschirm dargestellt ist.
Sie müssen warten, bis die Bildlaufansicht angezeigt wird, und dann mit einer dieser Lösungen nach oben verschieben. Dies ist eine bessere Lösung als ein Postdelay, da die Verzögerung nicht stört.
// Wait until my scrollView is ready
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Ready, move up
scrollView.fullScroll(View.FOCUS_UP);
}
});
ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll);
scroll.setFocusableInTouchMode(true);
scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
Ich stand vor demselben Problem Wenn ich Scrollview in View Flipper oder Dialog verwende, gibt scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
den Wert false zurück, sodass scrollViewObject.smoothScrollTo(0, 0)
für mich bearbeitet wird
final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview);
scrollview.post(new Runnable() {
public void run() {
scrollview.scrollTo(0, 0);
}
});
runOnUiThread( new Runnable(){
@Override
public void run(){
mainScrollView.fullScroll(ScrollView.FOCUS_UP);
}
}
Dies ist ein Bildlauf für scrollview :
scrollView.post(new Runnable() {
@Override
public void run() {
scrollView.scrollTo(0, 0);
scrollView.pageScroll(View.FOCUS_UP);
scrollView.smoothScrollTo(0,0);
}
});
Das ist für mich gearbeitet
scroll_view.smoothScrollTo(0,0); // scroll to top of screen
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Ready, move up
scrollView.fullScroll(View.FOCUS_UP);
}
});
@SuppressWarnings({ "deprecation", "unchecked" })
public void swipeTopToBottom(AppiumDriver<MobileElement> driver)
throws InterruptedException {
Dimension dimensions = driver.manage().window().getSize();
Double screenHeightStart = dimensions.getHeight() * 0.30;
int scrollStart = screenHeightStart.intValue();
System.out.println("s="+scrollStart);
Double screenHeightEnd = dimensions.getHeight()*0.90;
int scrollEnd = screenHeightEnd.intValue();
driver.swipe(0,scrollStart,0,scrollEnd,2000);
CommonUtils.threadWait(driver, 3000);
}