Tem um detalhe de UX em listas virtuais que aparece muito em ferramenta interna: mudar a seleção programaticamente sem deixar a rolagem artificial.
A intenção era reproduzir a sensação da navegação por teclado: mudar a seleção programaticamente, mas só rolar a lista quando o item sair da área visível. O problema é que scrollTo(index) sempre reposiciona e deixa a interface artificial.
A implementação analisava o intervalo visível com getFirstVisibleCell() e getLastVisibleCell(), mas falhava quando o item do topo estava apenas parcialmente visível.
No VirtualFlow, a primeira célula visível pode estar só parcialmente visível. Então, se você compara:
if (index < first) {
listView.scrollTo(index);
}
vai perder justamente o caso em que o item selecionado é o primeiro da janela, mas ainda não está completamente visível. Nesse cenário, trocar para index <= first já resolve o comportamento.
Achei esse caso ótimo porque ele não fala só de JavaFX; ele fala de como APIs de UI retornam estados intermediários que parecem corretos até você comparar com o comportamento nativo.
Quem trabalha com desktop ou componentes virtuais costuma tratar isso com heurística própria ou vocês confiam mais no contrato do toolkit?
Carregando comentários...