Pour une partie de mon application, une liste de noms est présentée à l'utilisateur. Il lui est demandé de les regrouper à sa guise.
(Remarque, le code de ListView a été copié textuellement à partir du didacticiel d'Android Views. Je ne l'ai pas encore adapté à mes besoins. J'essaie simplement de comprendre comment faire pour que cela fonctionne.)
La présentation de base est un LinearLayout, contenant un ScrollView (appelé "groupsScrollView" dans le code ci-dessous), contenant un RelativeLayout. J'ai quelques boutons et du texte, puis mon ListView dessous, qui affiche la liste des noms. Tout cela est plus haut que la zone d'écran visible, de sorte que l'utilisateur est autorisé à faire défiler verticalement pour voir tout.
Tout cela fonctionne à merveille, sauf que lorsque la page est chargée, elle est toujours précédée d'un défilement vers le haut de mon ListView - au milieu de la page. Le texte et les boutons que j'ai créés qui indiquent à l'utilisateur quoi faire ne sont pas visibles.
Je peux saisir l'écran et faire défiler vers le haut, cela fonctionne très bien, mais j'aimerais que l'écran se charge après avoir déjà fait défiler vers le haut. L'utilisateur ne devrait pas avoir à faire défiler vers le haut pour voir le haut d'une page fraîchement chargée. Mais tout ce que j'ai essayé de faire défiler par programme en haut de l'écran a échoué.
Voici ma méthode 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();
}
});
}
La ligne "mainScrollView.pageScroll (View.FOCUS_UP)" est le problème. Elle ne provoque pas d'erreur, mais ne semble rien y faire. J'ai essayé scrollTo (0,0), scrollDirection (View.FOCUS_UP ), et tout ce que je peux penser.
Étant donné que je ne reçois pas d'erreur, je dois supposer que ces commandes de défilement fonctionnent réellement, mais qu'elles défilent vers le haut de la liste, plutôt que vers le haut de la molette ScrollView ou RelativeLayout qui la contient. Cela semble être confirmé par la propre description de Google de la méthode scrollTo (int x, int y) où ils disent "Cette version fixe également le défilement aux limites de notre enfant".
Donc, pour prolonger une longue question, comment puis-je charger une série de vues sur l’écran contenu dans une vue ScrollView, puis faire défiler par programme le tout en haut de la page afin que l’utilisateur puisse interagir avec celle-ci?
Merci!
Essayer
mainScrollView.fullScroll(ScrollView.FOCUS_UP);
ça devrait marcher.
Avait le même problème, probablement une sorte de bug.
Même le fullScroll(ScrollView.FOCUS_UP)
de l'autre réponse n'a pas fonctionné .
La seule chose qui a fonctionné pour moi était d'appeler scroll_view.smoothScrollTo(0,0)
juste après l'affichage de la boîte de dialogue.
j'ai eu le même problème et cela a résolu le problème. J'espère que ça vous aide.
listView.setFocusable(false);
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
Cela fonctionne bien, mais le seul problème avec cette ligne est que, lorsque les données sont remplies dans scrollViewObject, a été appelée immédiatement. Vous devez attendre quelques millisecondes jusqu'à ce que les données soient renseignées. Essayez ce 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);
}
});
Le principal problème de toutes ces solutions valables est que vous essayez de monter le parchemin quand il n’est pas encore dessiné à l’écran.
Vous devez attendre que l'affichage défilement apparaisse à l'écran, puis déplacez-le vers le haut avec l'une de ces solutions. C'est une meilleure solution qu'un post-retard, car le retard ne vous gêne pas.
// 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);
J'ai rencontré le même problème Lorsque j'utilise Scrollview dans View Flipper ou Dialog, cette casse scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
renvoie false de sorte que la casse scrollViewObject.smoothScrollTo(0, 0)
soit résolue pour moi
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);
}
}
C'est forcer le défilement pour scrollview :
scrollView.post(new Runnable() {
@Override
public void run() {
scrollView.scrollTo(0, 0);
scrollView.pageScroll(View.FOCUS_UP);
scrollView.smoothScrollTo(0,0);
}
});
Cela a fonctionné pour moi
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);
}