Как создать ListView, которого нет в ScrollView, или если ScrollView отключен?
-
19-09-2019 - |
Вопрос
Мне нужны некоторые преимущества ListView, например возможность использовать ListAdapter, выбор элементов и т. д., но мне не нужна часть ScrollView.Я хочу реализовать эту часть сам, по-другому (почему и как я это делаю, на самом деле не суть этого вопроса, поэтому, пожалуйста, не спрашивайте «почему»).
Есть ли способ создать ListView, которого нет в ScrollView, или отключить прокрутку?
Решение
А ListView
не в ScrollView
.А ListView
выполняет прокрутку по своей сути.Я не верю, что можно отключить прокрутку с помощью простого API.Если да, то ваш выбор — либо создать подкласс ListView
и попытаться найти способы переопределить поведение прокрутки, клонировать ListView
и устраните поведение прокрутки или напишите свое собственное AdapterView
это делает вещи так, как вы хотите.
Другие советы
Другой способ сделать это — обернуть ListView
в любом специальном решении для прокрутки, которое вы придумали.Если вы просто установите высоту ListView
быть точно такой же высоты, как и все строки (используя представление списка LayoutParams
), тогда оно будет вести себя как обычное представление и не сможет прокручиваться;поэтому вы можете добавить его в другое представление прокрутки.Трудность этого метода заключается в том, что вам нужно заранее знать высоту списка, поэтому вам нужно знать высоту каждой строки.Кроме того, при этом будут созданы все строки одновременно, и вы не сможете воспользоваться функцией повторного использования представления.
Если у вас нет простого способа заранее рассчитать высоту, вы можете обмануть ListView
сделать это за вас, переопределив onMeasure
и присвоив ему свою собственную спецификацию высоты:
// 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);