example - Xamarin.Forms: ListView dentro de StackLayout: ¿Cómo establecer la altura?
xamarin forms listview itemtemplate example (6)
A continuación el código funcionó para mí,
protected override void OnAppearing()
{
base.OnAppearing();
listViewOrderCloths.HeightRequest = model.ListOrderedCloths.Count*100)/2 ;
}
En una ContentPage
tengo un ListView
dentro de un StackLayout
dentro de un ScrollView
. ListView
se llena ( ItemSource
está configurado) en ContentPage
cuando se llama a OnAppearing
y puedo ver que la lista se llena en el emulador. La orientación de StackLayout
es Vertical
y debajo de ListView
tengo un Button
.
Mi problema es que no importa cuántos elementos tenga el ListView
, tiene la altura de 53.33. Me gustaría que la altura de ListView
coincida con la altura total de los elementos que contiene. Al establecer HeightRequest
, puedo configurar la altura de ListView
a cualquier cosa que desee, pero como no conozco la altura de los elementos dentro de ListView
el resultado es que la distancia al botón de abajo es incorrecta y, por lo tanto, se ve fea. He intentado establecer VerticalOptions
tanto en ListView
como en StackLayout
para Start
y otras configuraciones, pero esto no cambia la altura de 53.33 (y si trato de combinar usando HeightRequest
y Start
, resulta que HeightRequest gana).
¿Como puedo resolver esto?
(disculpe la publicación cruzada del foro de Xamarin )
En Android, mi tabla creada en código estaba dejando espacios por encima y por debajo.
Esto lo arregló ...
HeightRequest="1000000"
Creo que tengo la solución más pirata.
La solución en mi caso fue colocar el ListView
dentro de un StackLayout
y luego colocar ese StackLayout
dentro del StackLayout
principal. Luego podría establecer VerticalOptions = LayoutOptions.FillAndExpand
en el StackLayout
interno (el que contiene el ListView
) con el resultado de que el ListView
obtuvo el espacio que necesitaba (que por supuesto varía según los datos).
Aquí está el código principal:
listView.ItemsSource = alternativeCells;
listView.ItemSelected += ListViewOnItemSelected;
var listStackLayout = new StackLayout
{
VerticalOptions = LayoutOptions.FillAndExpand,
Orientation = StackOrientation.Vertical
};
listStackLayout.Children.Add(listView);
_stackLayout.Children.Add(listStackLayout);
Como puede ver, agregué un nuevo StackLayout
con el único propósito de colocar el ListView
en su interior. Luego puse ese listStackLayout
dentro del _stackLayout
principal.
Vea la publicación en este post del foro de Xamarin para más información.
Me encontré con el mismo problema, y para mí esto funcionó a la perfección:
listView.HasUnevenRows = true;
Tuve el mismo problema, y esto fue lo único que resolví por mí (en XAML):
<StackLayout Orientation="Vertical"
VerticalOptions="Fill"
HorizontalOptions="StartAndExpand">
<ListView VerticalOptions="FillAndExpand"
RowHeight="<some row height>">
</ListView>
</StackLayout>
¡Espero que funcione!
Tuve una lucha similar, con una solución ligeramente diferente. En primer lugar, establecer un RowHeight en el ListView parecía ser fundamental. En segundo lugar, me encontré con un problema de tiempo de enlace +. Si se visualizó ListView y no tenía contenido, se configuró a una altura predeterminada (mostrando el espacio vacío). Si me mudé fuera de esta página y volví, el tamaño estaba bien.
Así que mi enfoque fue vincular la visibilidad de ListView a la presencia (o falta de) algo a lo que se vincula. Luego, cuando los datos regresaron, el ListView se hizo visible y tenía el tamaño adecuado.
<ListView x:Name="lvSettlements" ItemsSource="{Binding RecentSettlements}" VerticalOptions="FillAndExpand" RowHeight="25" IsVisible="{Binding RecentSettlements, Converter={StaticResource nullConverter}}">
...SNIP...
</ListView>