Как узнать высоту елемента в ListView
Как узнать высоту елемента в ListView
Простите если это уже обсуждалось, поиском ответ найти не смог.
Имеется список в который динамически добавляются елементы.
Необходимо сделать так чтобы отображались все елементы списка. После листа динамически добавляются ещё несколько компонентов.
Вобщем меня больше всего интересует как узнать высоту елемента списка, если я в методе getView() вызываю LayoutParams.height == 0. На сколько понимаю элемент ещё не построился, поэтому высоты не имеет.
Пишу под Android 2.3.3
Есть же реальная возможность?
Имеется список в который динамически добавляются елементы.
Необходимо сделать так чтобы отображались все елементы списка. После листа динамически добавляются ещё несколько компонентов.
Вобщем меня больше всего интересует как узнать высоту елемента списка, если я в методе getView() вызываю LayoutParams.height == 0. На сколько понимаю элемент ещё не построился, поэтому высоты не имеет.
Пишу под Android 2.3.3
Есть же реальная возможность?
Re: Как узнать высоту елемента в ListView
попробуйте метод:
у меня в большинстве случаев работает.
Код: Выделить всё
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;
}R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Как узнать высоту елемента в ListView
Спасибо, работает.
Но почему то чуть не так.
В класе моего компонента в методе update, который содержит в себе лист пишу такие строки:
и получаю высоту больше чем нужно. Экспериментальным путем вычисли что высота каждого айтема должна быть 20, а методом getDesireHeight получается 35.
Почему так?
Но почему то чуть не так.
В класе моего компонента в методе update, который содержит в себе лист пишу такие строки:
Код: Выделить всё
int height =0;
for(int i=0; i< adapter.getCount();i++){
height+=getDesireHeight(adapter.getView(i, this, null));
}
Почему так?
Re: Как узнать высоту елемента в ListView
если есть паддинги или маргины то метод наверное и их учитывает, если их отнять от компонента то получим реальную высоту.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Как узнать высоту елемента в ListView
А зачем использовать отражение?
Так не работает?
Так не работает?
Код: Выделить всё
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
onMesure можно только переопределять в кастомных вьюхах (объявлен как protected).
Re: Как узнать высоту елемента в ListView
Тогда, можеть быть можно так:
Код: Выделить всё
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
Спасибо, так тоже попробую.
Но сделал чуть иначе.
В метод onGlobalLayout() попадаем после прорисовки элемента, то есть его высота уже имеет конкретное значение, осталось только просумировать высоты всех элементов списка и если есть бордеры, добавить их высоту тоже.
Правда выглядит не совсем некрасиво, так как есть одна перерисовка. Как-бы появился лист, а потом сразу же перестроился на необходимую высоту.
Но сделал чуть иначе.
Код: Выделить всё
view.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@Override
public void onGlobalLayout() {
setHeight();
}});
Правда выглядит не совсем некрасиво, так как есть одна перерисовка. Как-бы появился лист, а потом сразу же перестроился на необходимую высоту.