Страница 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() попадаем после прорисовки элемента, то есть его высота уже имеет конкретное значение, осталось только просумировать высоты всех элементов списка и если есть бордеры, добавить их высоту тоже.
Правда выглядит не совсем некрасиво, так как есть одна перерисовка. Как-бы появился лист, а потом сразу же перестроился на необходимую высоту.