Как ограничить высоту ListView в GridLayout?

У меня есть GridLayout содержащий ListView и TextView . Когда элементы добавляются в ListView он будет расти в размерах и подталкивает TextView под ним из экрана. Я думал, что, установив layout_gravity="fill" в ListView, он не будет расти вообще, а займет все свободное место.

Как настроить ListView для захвата свободного места вместо того, чтобы расти и подталкивать представления под ним из экрана?

Я ищу решение с помощью GridLayout . Я знаю, что в моем случае LinearLayout будет работать. Однако это всего лишь минимальный тестовый пример, чтобы проиллюстрировать мою проблему.

Я не хочу устанавливать высоту программно, если это возможно.

 <android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:columnCount="1" app:useDefaultMargins="true" > <ListView app:layout_gravity="fill" /> <TextView android:text="TextView" /> </android.support.v7.widget.GridLayout> 

Этот ответ расширяет мои комментарии к вопросу и пытается объяснить, why this cannot be done with XML via GridLayout's attributes .

Добавление GridLayout в структуру позволило разрешить ряд недостатков относительно вложенных макетов, одним из которых является "inability to control alignment along both horizontal and vertical axes simultaneously" как описано в статье « Новые макеты виджета: пространство и сетка » Филиппа Милна.

Этот контроль выравнивания выполняется параметром layout_gravity , в description которого указано, что параметр "specifies how a component should be placed in its group of cells", ( NOT within a root layout ). В принципе, это то же самое, что и у LinearLayout , о котором также упоминалось в статье: "Alignment/gravity also works just like gravity in LinearLayout..." И, как мы знаем, для LinearLayouts , как только представление LinearLayouts всю высоту Экран (например, ListView в вашем случае), то под ним вид экрана ниже, если ориентация макета установлена ​​на "vertical" .

Если мы посмотрим на документацию GridLayout.LayoutParams, мы не найдем ни одного параметра, который позволил бы компоненту внутри группы ячеек придерживаться определенной позиции родительского макета и оставаться в позиции независимо от размера других компонентов в одном и том же группа; Аналогично параметрам layout_align[...] RelativeLayout.

Мое лучшее предположение об отсутствии таких параметров в GridLayout – лучший контроль выравнивания по сравнению с вложенными макетами.

Я уверен, что вы знаете решение (ы) для своей проблемы, используя подход, отличный от атрибутов GridLayout's . Я просто предлагаю сделать это, чтобы сделать ответ выполненным:

 <GridLayout ... > <RelativeLayout ... > <TextView ... android:id="@+id/tv" android:layout_alignParentBottom="true" /> <ListView ... android:layout_above="@id/tv"> </ListView> </RelativeLayout> </GridLayout> 

Вы можете программно установить высоту ListView следующим образом:

 ListView listView = (ListView) findViewById(R.id.listview); LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) listView.getLayoutParams(); layoutParams.height = listHeight; listView.setLayoutParams(layoutParams); listView.setAdapter(listAdapter); 

Тем не менее, я не могу придумать способ сделать этот масштаб хорошо для нескольких устройств.

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

Если вы хотите, вы можете установить TextView внутри нижнего колонтитула, а затем ListView не будет его выталкивать. Хотя я не уверен, что это то, что вы хотите

 <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- Footer aligned to bottom --> <RelativeLayout android:id="@+id/footer" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@drawable/background" android:gravity="center" > <!-- TextView Here --> </RelativeLayout> <!-- Content below header and above footer --> <RelativeLayout android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/footer" android:gravity="center" > <!-- ListView Here --> </RelativeLayout> </GridLayout> 

Вы должны использовать другой макет в качестве родителя для ListView и TextView и TextView их так, как хотите.

 <android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:columnCount="1" app:useDefaultMargins="true" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_above="@+id/text_view_id" /> <TextView android:id="@+id/text_view_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="TextView" /> </RelativeLayout> </android.support.v7.widget.GridLayout> 
Intereting Posts