Question

J'ai un LinearLayout qui contient d'autres points de vue et parmi ceux d'une ListView. Ce point de vue est chargé à partir d'un autre en cliquant sur un bouton.

Ce bouton spécifie en quelque sorte quel élément dans le ListView doit être le premier visible dans la liste. Les éléments qui remplit la liste sont récupérées via HTTP à partir d'un serveur externe.

Le problème est que je peux obtenir l'élément Nième d'être le premier dans la liste. S'il vous plaît noter, je ne veux pas déplacer former sa position actuelle à une nouvelle, je veux la liste à défilement.

Je l'ai essayé avec setSelected() et scrollTo(x,y) et scrollBy(x,y) mais pas de chance.

J'ai également donné un essai à cette pice de code, aussi laid que ce soit, mais je voulais juste essayer f il travaillait:

ListView categoryList = (ListView)findViewById(R.id.category_list);
        categoryList.post(new Runnable() {
            @Override
            public void run() {
                Log.d(this.getClass().getName(), "CategoryActivity.scrollToIndex: " + CategoryActivity.scrollToIndex);
                if(CategoryActivity.scrollToIndex>0){
                    ListView categoryList = (ListView)findViewById(R.id.category_list);
                    categoryList.setScrollContainer(true);
                    categoryList.scrollTo(4, CategoryActivity.scrollToIndex * 50);
                    categoryList.requestLayout();

                }
            }
        });

Et cela m'a donné un certain succès, mais le ListView a ensuite se comporter fou dans un sens, je ne suis même pas en mesure de décrire ....

Toute idée?

Était-ce utile?

La solution

Essayez d'ajouter à la file d'attente le message

categoryList.post(new Runnable() {
    public void run() {
        categoryList.scrollTo(4, CategoryActivity.scrollToIndex * 50);
    }
});

Il a travaillé pour moi dans un ScrollView ( vérifier cette réponse ).

Autres conseils

i fait des fonctions qui pourraient être utiles pour d'autres pour le défilement listview, ils travaillent pour moi dans toutes les versions Android, émulateur et périphérique, ici ItemHeight est la hauteur de vue fixe dans le listview.

int itemheight=60;
public void scrollToY(int position)
{
    int item=(int)Math.floor(position/itemheight);
    int scroll=(int) ((item*itemheight)-position);
    this.setSelectionFromTop(item, scroll);// Important
}
public void scrollByY(int position)
{
    position+=getListScrollY();
    int item=(int)Math.floor(position/itemheight);
    int scroll=(int) ((item*itemheight)-position);
    this.setSelectionFromTop(item, scroll);// Important
}
public int getListScrollY()
{
    try{
    //int tempscroll=this.getFirstVisiblePosition()*itemheight;// Important
    View v=this.getChildAt(0);
    int tempscroll=(this.getFirstVisiblePosition()*itemheight)-v.getTop();// Important
    return tempscroll;
    }catch(Exception e){}
    return 0;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top