Para parte do meu aplicativo, o usuário recebe uma lista de nomes e é solicitado a agrupá-los como acharem melhor.
(Observe que o código do ListView foi copiado literalmente do tutorial do Android Views. Ainda não o personalizei de acordo com minhas necessidades, estou apenas tentando descobrir como fazer isso funcionar.)
O layout básico é um LinearLayout, contendo um ScrollView (chamado "groupsScrollView" no código abaixo), contendo um RelativeLayout. Eu tenho alguns botões e texto e, em seguida, meu ListView abaixo dele, que exibe a lista de nomes. Como tudo isso é mais alto que a área visível da tela, o usuário pode rolar verticalmente para ver tudo.
Tudo isso funciona muito bem, exceto quando a página é carregada, ela é sempre pré-rolada para a parte superior do meu ListView - no meio da página. O texto e os botões que criei que informam ao usuário o que fazer não são visíveis.
Posso pegar a tela e rolar para cima, isso funciona muito bem, mas gostaria que a tela carregasse já tendo sido rolada para o topo. O usuário não precisa rolar para CIMA para ver a parte superior de uma página recém-carregada. Mas tudo o que tentei rolar programaticamente para o topo da tela falhou.
Aqui está o meu método onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.groups);
mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);
//get the Bundle out of the Intent...
Bundle extras = getIntent().getExtras();
mNames = extras.getStringArray("mNames");
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
//This is the line I'm having issues with
mainScrollView.pageScroll(View.FOCUS_UP);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
Toast.LENGTH_SHORT).show();
}
});
}
A linha "mainScrollView.pageScroll (View.FOCUS_UP); é o problema. Não causa um erro, mas parece não fazer nada. Tentei scrollTo (0,0), scrollDirection (View.FOCUS_UP ) e tudo o mais em que posso pensar.
Como não recebo um erro, devo assumir que esses comandos de rolagem estão realmente funcionando, mas estão rolando para a parte superior do ListView, em vez da parte superior do ScrollView ou RelativeLayout que o contém. Isso parece ser confirmado pela própria descrição do Google do método scrollTo (int x, int y), onde eles dizem "Esta versão também restringe a rolagem aos limites do nosso filho".
Portanto, para tornar uma pergunta longa ainda mais longa, como carrego várias visualizações na tela contidas em um ScrollView e depois rumo programaticamente a coisa toda para o topo da página para que o usuário possa interagir com ela?
Obrigado!
fonte
Teve o mesmo problema, provavelmente algum tipo de bug.
Até a
fullScroll(ScrollView.FOCUS_UP)
resposta da outra resposta não funcionou.A única coisa que funcionou para mim foi ligar
scroll_view.smoothScrollTo(0,0)
logo após o diálogo ser mostrado.fonte
fullScroll()
manter o item selecionado ainda selecionado após a movimentação. ComfullScroll()
, o primeiro item na visualização de rolagem foi novamente selecionado a cada vez no meu caso, independentemente do item selecionado antes da rolagem para cima.Eu tive o mesmo problema e isso foi corrigido. Espero que ajude você.
fonte
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
isso funciona bem, mas apenas o problema com esta linha é que, quando os dados são preenchidos no scrollViewObject, foram chamados imediatamente. Você precisa aguardar alguns milissegundos até que os dados sejam preenchidos. Tente este código:OU
fonte
O principal problema de todas essas soluções válidas é que você está tentando mover o rolo de papel quando ele ainda não está desenhado na tela.
Você precisa esperar até a exibição de rolagem aparecer na tela e movê-la para cima com qualquer uma dessas soluções. Esta é uma solução melhor do que um pós-atraso, porque você não se importa com o atraso.
fonte
onGlobalLayout
chamado métodoscrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Muito fácil
fonte
onCreate()
.Enfrentei o mesmo problema Quando estou usando o Scrollview dentro do View Flipper ou Dialog, esse caso
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
retorna falso, para que o casoscrollViewObject.smoothScrollTo(0, 0)
seja trabalhado para mimScroll Focus Top
fonte
fonte
fonte
Isso é trabalhado para mim
fonte
Isso é forçar rolagem para scrollview :
fonte
fonte
Corrigi meu problema no Kotlin assim:
fonte
fonte