Como rolar para baixo em um ScrollView na inicialização da atividade


96

Estou exibindo alguns dados em um ScrollView. Na inicialização da atividade (método onCreate), preencho o ScrollView com dados e desejo rolar até o final.

Tentei usar getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Isso funciona quando eu faço isso como uma ação no clique do botão, mas não funciona no método onCreate.

Existe alguma maneira de rolar o ScrollView para a parte inferior na inicialização da atividade? Isso significa que a exibição já foi rolada para o fundo quando exibida pela primeira vez.


Isso também explica por que eu estava obtendo 0 o tempo todo quando tentava usar getMeasuredWidth ao inicializar minha própria subclasse de um ScrollView.
Ghoti

Respostas:


218

Precisa ser feito da seguinte maneira:

    getScrollView().post(new Runnable() {

        @Override
        public void run() {
            getScrollView().fullScroll(ScrollView.FOCUS_DOWN);
        }
    });

Dessa forma, a visualização é primeiro atualizada e, em seguida, rola para a "nova" parte inferior.


1
Estou tentando exatamente isso, mas ainda não parece funcionar ... você está chamando o código acima onCreatedo que contém Activity?
pstanton

Estou fazendo isso em onStart
Palo

4
Em vez de post (), use postDelayed () com 100 ms de atraso. funcionará a partir de qualquer ponto do ciclo de vida das atividades.
Vitaliy A

50

Insira o seguinte código depois que seus dados forem adicionados:

final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
    @Override
    public void run() {
        scrollview.fullScroll(ScrollView.FOCUS_DOWN);
    }
});

4
Para mim, isso só funcionou com um postDelayed em vez de um post. Apenas 100 milissegundos de atraso.
Andreas Rudolph

Perfeito. Claro, com combo com scrollview.fullScroll (ScrollView.FOCUS_UP);
ieselisra

30

Isso funciona para mim:

scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollview.post(new Runnable() {
            public void run() {
                scrollview.fullScroll(View.FOCUS_DOWN);
            }
        });
    }
});

2
Melhor resposta para esta pergunta até agora. Muitas outras abordagens são condicionais, mas esta é incrível e funciona muito bem :)
rana

17

Você pode fazer isso no arquivo de layout:

                android:id="@+id/listViewContent"
                android:layout_width="wrap_content"
                android:layout_height="381dp" 
                android:stackFromBottom="true"
                android:transcriptMode="alwaysScroll">

8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);

4

Tente isto

    final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
    scrollview.post(new Runnable() {
       @Override
       public void run() {
         scrollview.fullScroll(ScrollView.FOCUS_DOWN);
       }
    });

3

Logo depois de anexar dados à visualização, adicione esta única linha:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

1

Depois de inicializar seu componente de IU e preenchê-lo com dados. adicione essas linhas ao seu método de criação

Runnable runnable=new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    };
    scrollView.post(runnable);

1

Essa é a melhor maneira de fazer isso.

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
});
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.