Android ListView scrollTo
-
28-09-2019 - |
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?
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;
}