Android ListView ScrollTo
-
28-09-2019 - |
Pergunta
eu tenho um LinearLayout
que contém algumas outras visualizações e entre aquelas ListView
. Esta exibição é carregada de outra clicando em um botão.
De alguma forma, esse botão especifica qual elemento no ListView precisa ser o primeiro visível na lista. Os elementos que preenchem a lista são recuperados via HTTP de um servidor externo.
O problema é que eu posso obter o enésimo elemento a ser o primeiro da lista. Observe que não quero movê -lo em uma posição atual para uma nova, quero que a lista role.
Eu tentei com setSelected()
e scrollTo(x,y)
e scrollBy(x,y)
Mas sem sorte.
Eu também tentei esse código de código, por mais feio que seja, mas eu só queria experimentar, estava funcionando:
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 isso me deu algum sucesso, mas o ListView estava se comportando louco De certa forma, nem consigo descrever ....
Qualquer ideia?
Solução
Tente adicioná -lo à fila de mensagens
categoryList.post(new Runnable() {
public void run() {
categoryList.scrollTo(4, CategoryActivity.scrollToIndex * 50);
}
});
Funcionou para mim em um scrollView (Verifique esta resposta).
Outras dicas
Fiz funções que poderiam ser úteis para outras pessoas para rolagem da ListView, elas funcionam para mim em todas as versões do Android, emulador e dispositivo, aqui o ItemHeight é a altura de visão fixa no 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;
}