Xamarin.Forms: ListView внутри StackLayout: как установить высоту?
В ContentPage
у меня есть ListView
внутри a StackLayout
внутри a ScrollView
. Заполняется ListView
(ItemSource
) в ContentPage
, когда OnAppearing
получает вызов, и я вижу, что список заполняется в эмуляторе. Ориентация StackLayout
Vertical
, а ниже ListView
у меня есть Button
.
Моя проблема в том, что независимо от того, сколько элементов имеет элемент ListView
, он получает высоту 53.33. Я бы хотел, чтобы высота ListView
соответствовала общей высоте элементов в ней. Установив HeightRequest
, я могу установить высоту ListView
на все, что захочу, но поскольку я не знаю высоту элементов внутри ListView
, результат чаще всего таков, что расстояние до кнопки под ним неверно и поэтому выглядит уродливым. Я попытался установить VerticalOptions
как на ListView
, так и на StackLayout
на Start
и другие параметры, но это не изменит высоту с 53.33 (и если я попытаюсь объединить с помощью HeightRequest
и Start
получается, что выигрывает HeightRequest).
Как я могу это решить?
(пожалуйста, извините перекрестное сообщение из форум Xamarin)
Ответы
Ответ 1
Решение в моем случае состояло в том, чтобы поместить ListView
внутрь a StackLayout
, а затем поставить StackLayout
внутри основного StackLayout
. Тогда я мог бы установить VerticalOptions = LayoutOptions.FillAndExpand
на внутреннем StackLayout
(тот, который содержит ListView
), в результате получив необходимое пространство ListView
(которое, конечно, варьируется в зависимости от данных).
Вот основной код:
listView.ItemsSource = alternativeCells;
listView.ItemSelected += ListViewOnItemSelected;
var listStackLayout = new StackLayout
{
VerticalOptions = LayoutOptions.FillAndExpand,
Orientation = StackOrientation.Vertical
};
listStackLayout.Children.Add(listView);
_stackLayout.Children.Add(listStackLayout);
Как вы видите, я добавил новый StackLayout
с единственной целью размещения ListView
внутри него. Затем я помещаю этот listStackLayout
в основной _stackLayout
.
Смотрите сообщение на этом форуме форума Xamarin для получения дополнительной информации
Ответ 2
Я столкнулся с той же проблемой, и для меня это работало как шарм:
listView.HasUnevenRows = true;
(http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/listview/#Display_Rows_with_Variable_Heights)
Ответ 3
С новой функцией BindableLayout
в Xamarin Forms 3.5 вы можете легко использовать ItemsSource
на StackPanel
.
Итак, в основном вы можете написать что-то вроде этого:
<StackLayout BindableLayout.ItemsSource="{Binding list}">
<BindableLayout.ItemTemplate>
<DataTemplate>
...
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
Вы можете прочитать больше об этом здесь: https://blog.xamarin.com/xamarin-forms-3-5-a-little-bindable-love/
Ответ 4
Ниже код работал у меня,
protected override void OnAppearing()
{
base.OnAppearing();
listViewOrderCloths.HeightRequest = model.ListOrderedCloths.Count*100)/2 ;
}
Ответ 5
У меня была та же проблема, и это было единственное, что я сделал для меня (в XAML):
<StackLayout Orientation="Vertical"
VerticalOptions="Fill"
HorizontalOptions="StartAndExpand">
<ListView VerticalOptions="FillAndExpand"
RowHeight="<some row height>">
</ListView>
</StackLayout>
Надеюсь, что это сработает!
Ответ 6
У меня была подобная борьба, с немного другим решением. Во-первых, установка RowHeight в ListView казалась ключевой. Во-вторых, я столкнулся с проблемой привязки + времени. Если ListView был отображен и не содержал содержимого, он был установлен на высоту по умолчанию (показывая пустое пространство). Если бы я отошел от этой страницы и вернулся, размер был в порядке.
Итак, мой подход заключался в привязке видимости ListView к присутствию (или отсутствию) чего-то связанного. Затем, когда данные вернулись, ListView стал видимым и имел правильный размер.
<ListView x:Name="lvSettlements" ItemsSource="{Binding RecentSettlements}" VerticalOptions="FillAndExpand" RowHeight="25" IsVisible="{Binding RecentSettlements, Converter={StaticResource nullConverter}}">
...SNIP...
</ListView>
Ответ 7
На Android моя таблица, созданная в коде, оставляла пробелы выше и ниже.
Это исправило это...
HeightRequest="1000000"
Я думаю, что у меня есть самое хакерское решение.
Ответ 8
Принятый ответ не применим к моей ситуации, когда мой ListView
может быть длиннее, чем длина экрана, поэтому его необходимо поместить в ScrollView
, который возвращает пустое пространство.
Как я решил, они должны были иметь StackLayout
верхнего уровня, а затем поместить ListView
в немедленный ScrollView
, как в следующем XAML:
<?xml version="1.0" encoding="utf-8" ?>
<local:ContentPage>
<StackLayout x:Name="entirePage">
<ScrollView VerticalOptions="FillAndExpand"
Orientation="Vertical">
<ListView x:Name="listView" ItemsSource="{Binding Items}"
Margin="0">
<!-- ListView Stuff -->
</ListView>
</ScrollView>
</StackLayout><!--entirePage-->
</local:ContentPage >