Xamarin.Formulaires: ListView inside StackLayout: comment définir la hauteur?

Dans a ContentPage j'ai un ListView dans a StackLayout dans a ScrollView. Le ListView est rempli (ItemSource est défini) dans le ContentPage lorsque OnAppearing est appelé et je vois que la liste est renseignée dans l'émulateur. L'orientation StackLayout s est Vertical et en dessous du ListView j'ai un Button.

Mon problème est que peu importe combien d'éléments le ListView A, il obtient la hauteur de 53.33. Je voudrais que la hauteur du ListView corresponde à la hauteur totale des éléments qu'il contient. En définissant HeightRequest, je peux définir la hauteur de le ListView à tout ce que je veux, mais comme je ne connais pas la hauteur des éléments à l'intérieur du ListView le résultat est le plus souvent que la distance au bouton ci-dessous est incorrecte et semble donc moche. J'ai essayé de mettre des VerticalOptions sur le ListView et le StackLayout à Startet d'autres paramètres, mais cela ne change pas la hauteur de 53.33 (et si j'essaie de combiner à l'aide de HeightRequest et Start, il s'avère que HeightRequest l'emporte).

Comment puis-je résoudre cela?

(veuillez excuser le la croix-affichage à partir de Xamarin forum)

29
demandé sur Halvard 2014-07-06 21:07:32

6 réponses

La solution dans mon cas était de mettre les ListView dans a StackLayout et ensuite mettre cette StackLayout dans le StackLayout. Ensuite, je pourrais définir le VerticalOptions = LayoutOptions.FillAndExpand sur le StackLayout interne (celui contenant le ListView) avec le résultat que le ListView A l'espace nécessaire (ce qui varie bien sûr en fonction des données).

Voici le code 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);

Comme vous le voyez, j'ai ajouté un nouveau StackLayout avec le seul but de mettre les ListView à l'intérieur. Ensuite, je mets que listStackLayout dans le principal _stackLayout.

Voir le post sur ce forum Xamarin post pour plus d'Informations

16
répondu Halvard 2014-07-24 07:44:51

J'ai rencontré le même problème, et pour moi cela a fonctionné comme un charme:

listView.HasUnevenRows = true;

(http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/listview/#Display_Rows_with_Variable_Heights)

10
répondu Norbor Illig 2015-06-23 21:25:28

Le code ci-dessous a fonctionné pour moi,

protected override void OnAppearing()
{
base.OnAppearing(); 
listViewOrderCloths.HeightRequest = model.ListOrderedCloths.Count*100)/2 ;
}
7
répondu Vinod Kumar 2016-05-22 07:29:34

J'ai eu le même problème, et c'était la seule chose que j'ai faite qui a résolu pour moi (en XAML):

<StackLayout Orientation="Vertical"
             VerticalOptions="Fill"
             HorizontalOptions="StartAndExpand">
    <ListView VerticalOptions="FillAndExpand"
              RowHeight="<some row height>">
    </ListView>
</StackLayout>

J'espère que ça marche!

6
répondu Marcio Martins 2016-05-06 20:32:27

J'ai eu une lutte similaire, avec une solution légèrement différente. Tout d'abord, définir un RowHeight sur le ListView semblait être essentiel. Deuxièmement, je rencontrais un problème de liaison + timing. Si le ListView était affiché et n'avait pas de contenu, il était défini sur une hauteur par défaut (montrant l'espace vide). Si je me suis éloigné de cette page et que je suis revenu, la taille était bonne.

Donc, mon approche était de lier la visibilité de ListView à la présence (ou à l'absence) de quelque chose. Puis, quand les données sont revenues, le ListView est devenu visible et avait la bonne taille.

<ListView x:Name="lvSettlements" ItemsSource="{Binding RecentSettlements}"  VerticalOptions="FillAndExpand" RowHeight="25" IsVisible="{Binding RecentSettlements, Converter={StaticResource nullConverter}}">
...SNIP...
</ListView>
0
répondu BRass 2016-10-14 17:43:13

Sur Android, ma table créée dans le code laissait des lacunes au-dessus et au-dessous.

Cela l'a réparé...

HeightRequest="1000000"

Je pense que j'ai la solution la plus hackée.

0
répondu Ian Warburton 2018-04-26 15:07:23