Como faço para criar um ListView que não está em um ScrollView, ou tem o ScrollView desativado?
-
19-09-2019 - |
Pergunta
Eu quero algumas das guloseimas em um ListView, como ser capaz de usar um ListAdapter e seleção de itens, etc, mas eu não quero a parte ScrollView dele. Eu quero implementar essa parte eu mesmo, de uma maneira diferente (por que ou como eu faço isso não é realmente o ponto desta questão, então, por favor, não pergunte "por quê").
Existe uma maneira de ter um ListView que não está em um ScrollView ou tem a rolagem desativado?
Solução
A ListView
não está em ScrollView
. A ListView
não rolagem intrinsecamente. Eu não acredito que você pode desativar a rolagem através de uma API simples. Se assim for, suas escolhas são ou ListView
subclasse e tentar encontrar maneiras de substituir a rolagem comportamentos, ListView
clone e eliminar a rolagem comportamentos, ou escreve sua própria AdapterView
que torna as coisas da maneira que quiser.
Outras dicas
Outra maneira de fazer isso é envolver o ListView
em qualquer solução personalizada rolagem você cozinhou para cima. Se você definir apenas a altura do ListView
ser exatamente tão alto como todas as linhas (usando LayoutParams
da exibição de lista), então ele vai agir como um modo normal e não será capaz de rolagem; portanto, você pode adicioná-lo para outra vista de rolagem. A dificuldade com este método é que você tem que saber a altura da sua lista antes do tempo, então você tem que saber a altura de cada linha. Além disso, isso vai criar todas as linhas de uma só vez e assim você não será capaz de tirar proveito do recurso de reciclagem de vista.
Se você não tem uma maneira fácil de calcular a altura antes do tempo, você pode enganar o ListView
em fazê-lo para você, substituindo onMeasure
e dando-lhe a sua própria altura spec:
// Calculate height of the entire list by providing a very large
// height hint. But do not use the highest 2 bits of this integer;
// those are reserved for the MeasureSpec mode.
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);