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?

Foi útil?

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top