О, мальчик, да, у тебя будут проблемы с этим. Это сводит меня с ума, что ListViews и GridView нельзя расширить, чтобы обернуть их детей, потому что мы все знаем, что у них есть более полезные функции в дополнение к их прокрутке и переработке своих детей.
Тем не менее, вы можете взломать это или создать свой собственный макет, чтобы удовлетворить ваши потребности без особых сложностей. Сверху головы я могу думать о двух возможностях:
В моем собственном приложении я встроил ListView в ScrollView. Я сделал это, явно указав ListView, чтобы он был точно таким же высоким, как и его содержимое. Я делаю это, изменяя параметры макета прямо внутри метода ListView.onMeasure()
следующим образом:
public class ExpandableListView extends ListView {
boolean expanded = false;
public ExpandableListView(Context context, AttributeSet attrs, int defaultStyle) {
super(context, attrs, defaultStyle);
}
public boolean isExpanded() {
return expanded;
}
public void setExpanded(boolean expanded) {
this.expanded = expanded;
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// HACK! TAKE THAT ANDROID!
if (isExpanded()) {
// Calculate entire height by providing a very large height hint.
// View.MEASURED_SIZE_MASK represents the largest height possible.
int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}
Это работает, потому что, когда вы задаете для ListView режим AT_MOST
, он создает и измеряет все свои дочерние элементы для вас прямо внутри метода onMeasure
(я обнаружил это, просматривая исходный код). Надеемся, что GridView ведет себя так же, но если это не так, вы все равно можете измерить все содержимое GridView самостоятельно. Но было бы проще, если бы вы могли обмануть GridView, сделав это за вас.
Теперь вы должны иметь в виду, что это решение полностью отключит повторное использование представления, что делает GridView настолько эффективным, и все эти ImageViews будут в памяти, даже если они не видны. То же самое касается моего следующего решения.
Другая возможность - отказаться от GridView и создать свой собственный макет. Вы можете расширить либо AbsoluteLayout
, либо RelativeLayout
. Например, если вы расширяете RelativeLayout
, вы можете поместить каждое изображение LEFT_OF
в предыдущее, отслеживая ширину каждого изображения, пока у вас не останется свободного места в этом ряду, а затем начать следующий ряд, поместив первый изображение новой строки BELOW
самое высокое изображение последней строки. Чтобы получить изображения по горизонтали или в одинаково разнесенных столбцах, вам придется пережить еще большую боль. Возможно AbsoluteLayout лучше. В любом случае, какая-то боль.
Удачи.