Как узнать высоту елемента в ListView

Интерфейс, диалоги, темы, стили, меню
Ответить
Taras
Сообщения: 5
Зарегистрирован: 24 сен 2012, 17:13

Как узнать высоту елемента в ListView

Сообщение Taras » 05 окт 2012, 12:10

Простите если это уже обсуждалось, поиском ответ найти не смог.
Имеется список в который динамически добавляются елементы.
Необходимо сделать так чтобы отображались все елементы списка. После листа динамически добавляются ещё несколько компонентов.
Вобщем меня больше всего интересует как узнать высоту елемента списка, если я в методе getView() вызываю LayoutParams.height == 0. На сколько понимаю элемент ещё не построился, поэтому высоты не имеет.
Пишу под Android 2.3.3
Есть же реальная возможность?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Как узнать высоту елемента в ListView

Сообщение rezak90 » 05 окт 2012, 12:15

попробуйте метод:

Код: Выделить всё

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
Политика на форуме запрещена

Taras
Сообщения: 5
Зарегистрирован: 24 сен 2012, 17:13

Re: Как узнать высоту елемента в ListView

Сообщение Taras » 05 окт 2012, 12:59

Спасибо, работает.
Но почему то чуть не так.

В класе моего компонента в методе update, который содержит в себе лист пишу такие строки:

Код: Выделить всё

int height =0;
		for(int i=0; i< adapter.getCount();i++){
			height+=getDesireHeight(adapter.getView(i, this, null));
		}
и получаю высоту больше чем нужно. Экспериментальным путем вычисли что высота каждого айтема должна быть 20, а методом getDesireHeight получается 35.
Почему так?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Как узнать высоту елемента в ListView

Сообщение rezak90 » 05 окт 2012, 13:13

если есть паддинги или маргины то метод наверное и их учитывает, если их отнять от компонента то получим реальную высоту.
R.id.team
Политика на форуме запрещена

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Как узнать высоту елемента в ListView

Сообщение math64 » 05 окт 2012, 23:55

А зачем использовать отражение?
Так не работает?

Код: Выделить всё

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;
        }

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Как узнать высоту елемента в ListView

Сообщение AndreyI » 06 окт 2012, 02:38

onMesure можно только переопределять в кастомных вьюхах (объявлен как protected).

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Как узнать высоту елемента в ListView

Сообщение math64 » 07 окт 2012, 16:53

Тогда, можеть быть можно так:

Код: Выделить всё

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;
        }

Taras
Сообщения: 5
Зарегистрирован: 24 сен 2012, 17:13

Re: Как узнать высоту елемента в ListView

Сообщение Taras » 08 окт 2012, 10:44

Спасибо, так тоже попробую.
Но сделал чуть иначе.

Код: Выделить всё

view.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
	@Override
		public void onGlobalLayout() {
			setHeight();
		}});
В метод onGlobalLayout() попадаем после прорисовки элемента, то есть его высота уже имеет конкретное значение, осталось только просумировать высоты всех элементов списка и если есть бордеры, добавить их высоту тоже.
Правда выглядит не совсем некрасиво, так как есть одна перерисовка. Как-бы появился лист, а потом сразу же перестроился на необходимую высоту.

Ответить