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.

Palo
fonte
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.

Palo
fonte
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);
    }
});
Harshid
fonte
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);
            }
        });
    }
});
Sonida
fonte
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">
Tam Dao
fonte
8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);
Makvin
fonte
4

Tente isto

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

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

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);
LEMUEL ADANE
fonte
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);
Ramzy Hassan
fonte
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);
                }
            });
        }
});
rana
fonte