Страница 1 из 1
Как узнать высоту елемента в ListView
Добавлено: 05 окт 2012, 12:10
Taras
Простите если это уже обсуждалось, поиском ответ найти не смог.
Имеется список в который динамически добавляются елементы.
Необходимо сделать так чтобы отображались все елементы списка. После листа динамически добавляются ещё несколько компонентов.
Вобщем меня больше всего интересует как узнать высоту елемента списка, если я в методе getView() вызываю LayoutParams.height == 0. На сколько понимаю элемент ещё не построился, поэтому высоты не имеет.
Пишу под Android 2.3.3
Есть же реальная возможность?
Re: Как узнать высоту елемента в ListView
Добавлено: 05 окт 2012, 12:15
rezak90
попробуйте метод:
Код: Выделить всё
public static int getDesireHeight(View view)
{
try
{
Method m = view.getClass().getDeclaredMethod("onMeasure", int.class, int.class);
m.setAccessible(true);
m.invoke(view, MeasureSpec.makeMeasureSpec(view.getWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
}
catch (Exception e)
{
return -1;
}
int measuredHeight = view.getMeasuredHeight();
return measuredHeight;
}
у меня в большинстве случаев работает.
Re: Как узнать высоту елемента в ListView
Добавлено: 05 окт 2012, 12:59
Taras
Спасибо, работает.
Но почему то чуть не так.
В класе моего компонента в методе update, который содержит в себе лист пишу такие строки:
Код: Выделить всё
int height =0;
for(int i=0; i< adapter.getCount();i++){
height+=getDesireHeight(adapter.getView(i, this, null));
}
и получаю высоту больше чем нужно. Экспериментальным путем вычисли что высота каждого айтема должна быть 20, а методом getDesireHeight получается 35.
Почему так?
Re: Как узнать высоту елемента в ListView
Добавлено: 05 окт 2012, 13:13
rezak90
если есть паддинги или маргины то метод наверное и их учитывает, если их отнять от компонента то получим реальную высоту.
Re: Как узнать высоту елемента в ListView
Добавлено: 05 окт 2012, 23:55
math64
А зачем использовать отражение?
Так не работает?
Код: Выделить всё
public static int getDesireHeight(View view)
{
view.onMesure(MeasureSpec.makeMeasureSpec(view.getWidth(), MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int measuredHeight = view.getMeasuredHeight();
return measuredHeight;
}
Re: Как узнать высоту елемента в ListView
Добавлено: 06 окт 2012, 02:38
AndreyI
onMesure можно только переопределять в кастомных вьюхах (объявлен как protected).
Re: Как узнать высоту елемента в ListView
Добавлено: 07 окт 2012, 16:53
math64
Тогда, можеть быть можно так:
Код: Выделить всё
public static int getDesireHeight(View view)
{
view.forceLayout();
view.measure(MeasureSpec.makeMeasureSpec(view.getWidth(), MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int measuredHeight = view.getMeasuredHeight();
return measuredHeight;
}
Re: Как узнать высоту елемента в ListView
Добавлено: 08 окт 2012, 10:44
Taras
Спасибо, так тоже попробую.
Но сделал чуть иначе.
Код: Выделить всё
view.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@Override
public void onGlobalLayout() {
setHeight();
}});
В метод onGlobalLayout() попадаем после прорисовки элемента, то есть его высота уже имеет конкретное значение, осталось только просумировать высоты всех элементов списка и если есть бордеры, добавить их высоту тоже.
Правда выглядит не совсем некрасиво, так как есть одна перерисовка. Как-бы появился лист, а потом сразу же перестроился на необходимую высоту.