Intereting Posts
Создание макета без рамки, которая перекрывает фоновый слой IAB startSetup NullPointerException Определять действие по умолчанию (когда приложение запускается) программно Как заказать мою базу данных SQLITE в порядке убывания, для приложения для Android? Пользовательский API-интерфейс точного выравнивания по значению <21 с поддержкой библиотеки 22.1.1 Отсутствует AndroidManifest.xml при импорте старого проекта Android в Eclipse Как изменить идентификатор группы файла на корневом устройстве Android? Android – ArrayAdapter.createViewFromResource (int, View, ViewGroup, int) строка: 355 NullPointerException Декодировать массив байтов в растровое изображение, сжатое в Java Настроить adb на Mac OS X GetHttpResponseCode () возвращает -1 в android 2.2 Использовать Chrome как средство рендеринга для веб-просмотра Android Как связать дочернюю активность с TabHost для вызова публичной функции? Android-браузер Триггеры jQuery $ (окно) .resize () при прокрутке Как изменить цвет строки состояния в android

Android – Получить высоту элемента списка ListView?

Есть ли способ получить высоту ListViewItem в коде, если в списке нет фактических элементов?

Мой макет ListViewItem:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight"> ... </LinearLayout> 

Я попытался получить его с помощью Inflater:

 View convertView = LayoutInflater.from( this ) .inflate( R.layout.mail_list_row, null ); int itemHeight = convertView.getHeight(); 

Но это возврат 0;

Благодаря!

Solutions Collecting From Web of "Android – Получить высоту элемента списка ListView?"

В android для представления назначается ширина и высота только тогда, когда его рендеринг завершен. Поэтому, если вы не перечислите, вы будете получать по крайней мере один раз, когда вы не получите listItemHeight. Решение вашей проблемы может заключаться в том, что вы устанавливаете минимальную высоту элемента списка, чтобы у вас было по крайней мере что-то работать, а не на жестком кодировании высоты и ширины.

Попробуйте это, это сработает для вас.

 private static final int UNBOUNDED = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); // To calculate the total height of all items in ListView call with items = adapter.getCount() public static int getItemHeightofListView(ListView listView, int items) { ListAdapter adapter = listView.getAdapter(); int grossElementHeight = 0; for (int i = 0; i < items; i++) { View childView = adapter.getView(i, null, listView); childView.measure(UNBOUNDED, UNBOUNDED); grossElementHeight += childView.getMeasuredHeight(); } return grossElementHeight; } 

Оптимизированная версия кода Dwivedi Ji с высотой делителей и без лишних параметров:

 private int calculateHeight(ListView list) { int height = 0; for (int i = 0; i < list.getCount(); i++) { View childView = list.getAdapter().getView(i, null, list); childView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); height+= childView.getMeasuredHeight(); } //dividers height height += list.getDividerHeight() * list.getCount(); return height; } 

Как указано выше, Hariseldon78 указывает, что ни одно из этих решений не устраняет проблему REAL, которая определяет высоту строки списка элементов перед ее визуализацией. У меня была та же проблема, что и для масштабирования некоторых изображений в высоту строк в элементе ListView и не хотелось масштабировать их до фиксированного значения. Если тема привела к тому, что текст в других частях моей строки был разным по высоте, мне нужна высота, чтобы в моей процедуре getView моего адаптера я мог соответствующим образом изменить размер bmap. Я боролся с проблемой, что getHeight и все измеренные высоты сообщают ноль, пока строка не будет показана. Когда я увижу, что высоты были правильными позже, было слишком поздно.

Мое решение состоит в том, чтобы создать onLayoutChangedListener () в первый раз через getView и только для строки 0. Слушатель будет запускаться, как только getView для первой позиции (0) завершает выполнение, и в это время параметр «bottom» скажет вам Высота строки. Я записываю это в переменную класса пользовательского адаптера, поэтому он доступен в качестве параметра высоты без необходимости снова получать высоту.

Слушатель самостоятельно регистрирует себя как часть его выполнения. Это обеспечивает правильную высоту для строк 1-N, но не для нулевой строки. Для нулевой строки я сделал что-то действительно противное. У меня был вызов слушателя getView AGAIN для строки 0 после установки другой пользовательской переменной класса адаптера для управления рекурсией. Во второй раз, когда getView (0) запускает, он не будет настраивать слушателя, и найдет действительный параметр для высоты, чтобы работать, и все это хорошо.

Код ниже – не нужно рассказывать мне, как это AWFUL это – если бы андроид не должен был так сильно волноваться, чтобы сказать, насколько большой я создаю представление, когда я заполняю представление на основе рендеринговых парм для Я бы не стал делать это уродство, но он работает. Извините, если форматирование кода ужасно …

 int mHeight = 0; @Override public View getView(final int position, View convertView, ViewGroup parent) { ... usual boiler plate stuff // JUST THE FIRST TIME if (position == 0 && mHeight == 0) { final View ref = convertView; convertView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { ref.removeOnLayoutChangeListener(this); mHeight = bottom; firstTime = false; // NOW LETS REGET THE FIRST VIEW WITH THE HEIGHT CORRECT int visiblePosition = getListView().getFirstVisiblePosition(); View view = getListView().getChildAt(0 - visiblePosition); getListAdapter().getView(0, view, getListView()); // RECURSION LOL } }); } // Configure the view for this row .... // HOW BIG IS THE VIEW? // NOW IF NOT FIRSTTIME (MHEIGHT != 0) if (mHeight != 0) { // DO OUR IMAGE SETUP HERE CAUSE mHeight is RIGHT! Log.d(TAG, "mHeight=" + mHeight); } return convertView; }