Domanda

Ho un LinearLayout che contiene alcuni altri punti di vista e tra coloro una ListView. Questo punto di vista è stato caricato da un altro facendo clic su un pulsante.

Questo pulsante in qualche modo di specificare quanto elemento della ListView deve essere il primo visibile nell'elenco. Gli elementi che popola la lista vengono richiamati tramite HTTP da server esterni.

Il problema è che posso ottenere l'elemento ennesimo di essere il primo della lista. Si prega di notare, non voglio spostarlo forma essa posizione attuale ad uno nuovo, voglio la lista a scorrimento.

Ho provato con setSelected() e scrollTo(x,y) e scrollBy(x,y) ma senza fortuna.

Ho anche dato una prova per questa pice di codice, così brutto come lo è, ma volevo solo provare f stava funzionando:

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();

                }
            }
        });

E questo mi ha dato un certo successo, ma il ListView è stato poi comportando pazzo in un modo che non sono nemmeno in grado di descrivere ....

Qualche idea?

È stato utile?

Soluzione

Provare ad aggiungere al messaggio coda di

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

Ha funzionato per me in uno ScrollView ( controllare questa risposta ).

Altri suggerimenti

ho fatto funzioni che potrebbero essere utili per altri per ListView scorrimento, lavorano per me in tutte le versioni di Android, emulatore e dispositivo, qui ItemHeight è l'altezza fissa di vista nel 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top