2016-07-27 20 views
3

StackLayoutとListViewを使用してビューの一部を表示していますが、ListViewのスペースが必要以上に大きくなり、リストの最後の行とプロフィール継続それは私のListViewが本当のリストの長さよりも多くの行を持っているようだ、あるいはそれが固定の高さを持って、私はここで...知らない私のXAMLです:ListViewで必要以上のスペースがあります

<ScrollView> 
    <StackLayout Orientation="Vertical" Spacing="10"> 

    <Label Text="{Binding Establishment.Name}" TextColor="Black" HorizontalOptions="StartAndExpand" Style="{DynamicResource TitleStyle}" FontAttributes="Bold"/> 

    <Label Text="{Binding Establishment.Category.Name, StringFormat='Categoria: {0}'}" TextColor="Black" HorizontalOptions="StartAndExpand" FontAttributes="Bold"/> 

    <Label Text="{Binding Establishment.Description}" TextColor="Black" HorizontalOptions="StartAndExpand" LineBreakMode="WordWrap" XAlign="Start"/> 

    <Label Text="Contatos" TextColor="Black" HorizontalOptions="StartAndExpand" FontAttributes="Bold"/> 

    <ListView ItemsSource="{Binding Establishment.Contacts}" VerticalOptions="Start" HasUnevenRows="True"> 
     <ListView.ItemTemplate> 
     <DataTemplate> 
      <TextCell Text="{Binding Value}" Detail="{Binding StringType}" DetailColor="Gray"/> 
     </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

    <Label Text="Endereço" TextColor="Black" HorizontalOptions="StartAndExpand" FontAttributes="Bold"/> 

    <Label Text="{Binding Establishment.FullAddress}" TextColor="Black" HorizontalOptions="StartAndExpand" /> 

    <Button Text="Ver no mapa"/> 

    </StackLayout> 
</ScrollView> 

私はそれを解決することができますか?私はHasUnevenRows="True"を使用している人々を見たが、それは私には役に立たなかった。

+0

は、リストビューにHeightRequest値を設定しようとしているこれを行うための別の方法を見つけることができますしてください? – Jason

答えて

1

は皆さんありがとうございましたが、何も私のために働いていません。私は確かに自分で考えた解決策は、最良のものではありませんが、それは私の作品.....私はこのような空のStackLayout左XAMLで

<StackLayout x:Name="ContactsList" Orientation="Vertical" Spacing="10" Padding="8,0"> 
     <!-- Empty because it will be filled in code mode --> 
    </StackLayout> 

そしてを、私は、リスト内でそれを直接スクロール機能を必要としないため、リストには、実際にListViewコントロールではありませんので、私はこれを作った

private void setUpContacts(Establishment establishment) 
    { 
     foreach(Contact contact in establishment.Contacts) 
     { 
      StackLayout row = new StackLayout 
      { 
       Orientation = StackOrientation.Vertical 
      }; 

      row.Children.Add(new Label 
      { 
       TextColor = Color.Gray, 
       Text = string.Format("{0}:", contact.StringType) 
      }); 

      row.Children.Add(new Label 
      { 
       TextColor = Color.Black, 
       FontAttributes = FontAttributes.Bold, 
       Text = contact.Value, 
      }); 

      row.GestureRecognizers.Add(new TapGestureRecognizer { 
       Command = new Command(() => OnContactTapped(row, contact)) 
      }); 

      ContactsList.Children.Add(row); 
     } 
    } 

:の.csファイルに、私はのInitializeComponent()メソッドの後に、このメソッドを呼び出しましたこのビューのもう一つの部分です。パフォーマンス上の問題は発生しませんが、これには少数のアイテム(最大5個)が含まれるためです。私はこの問題を持つ他の人を助ける正しい答えとしてこれをマークしています。

しかし、これは誰もが行うことができますBIG NOOBソリューションである場合には、私に答えて、私は

+1

リストにいくつかしかないなら、あなたの解決策はちょうど良い、特にそれがあなたのために働く場合。私はコード内の別の場所で 'Grid'を使って同様のことをします。どのように解決したかをお寄せいただきありがとうございます。 – hvaughan3

+0

フィードバックいただきありがとうございます! –

2

最初に、Xamarinは、ScrollViewListViewを入れないことを提案します。これは、スクロールとお互いの戦いを提供するためです。私は個人的にこれを試しましたが、それはしばしばAndroidで特に奇妙な動作を引き起こします。

代わりにListView.HeaderTemplateListView.FooterListView.FooterTemplateListView.Headerを使用しています。 Xamarinのリンクhereこれはあなたの正確なシナリオを可能にしますが、奇妙な動作の問題はありません。あなたがその事例を見たいと思ったら、教えてください。

のサイズに合わせて想定されていないので、あなたがあなたの現在のレイアウトに行かなければならない必要があり、あなたがListViewニーズを特定のHeightWidthまたはLayoutOptionsでサイジングする方法について話しthisポストをチェックアウトしようとすることができなければならない場合それは内容です。そのポストにはいくつか解決策がありますが、私はまだ試していません。 this

が与えられているのいずれかの回避策を投稿し、StackLayoutListViewを追加し、別のStackLayoutにそれを追加すると言います。その後、StackLayoutVerticalOptionsLayoutOptions.FillAndExpandに設定します。

だから、次のようになります。それは本当に良い習慣ではないと述べ

<ScrollView> 
    <StackLayout Orientation="Vertical" Spacing="10"> 

    .... 

    <StackLayout VerticalOptions="FillAndExpand"> 
     <ListView ItemsSource="{Binding Establishment.Contacts}" VerticalOptions="Start" HasUnevenRows="True"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
      <TextCell Text="{Binding Value}" Detail="{Binding StringType}" DetailColor="Gray"/> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
     </ListView> 
    </StackLayout> 

    .... 

    </StackLayout> 
</ScrollView> 
+0

私の解決策についてどう思いますか? –

2

hvaughan3 通り。しかし、私は同じケースを持っていたと私は行動と回避策を使用:

public class ListViewHeightBehavior : Behavior<ListView> 
{ 
    private ListView _listView; 

    public static readonly BindableProperty ExtraSpaceProperty = 
     BindableProperty.Create(nameof(ExtraSpace), 
           typeof(double), 
           typeof(ListViewHeightBehavior), 
           0d); 

    public double ExtraSpace 
    { 
     get { return (double)GetValue(ExtraSpaceProperty); } 
     set { SetValue(ExtraSpaceProperty, value); } 
    } 

    protected override void OnAttachedTo(ListView bindable) 
    { 
     base.OnAttachedTo(bindable); 

     _listView = bindable; 
     _listView.PropertyChanged += (s, args) => 
     { 
      var count = _listView.ItemsSource?.Count(); 
      if (args.PropertyName == nameof(_listView.ItemsSource) 
        && count.HasValue 
        && count.Value > 0) 
      { 
       _listView.HeightRequest = _listView.RowHeight * count.Value + ExtraSpace; 
      } 
     }; 
    } 
} 

XAML:

 <ListView ItemsSource="{Binding Items}" 
       HasUnevenRows="True"> 
     <ListView.Behaviors> 
     <behaviors:ListViewHeightBehavior ExtraSpace="180"/> 
     </ListView.Behaviors> 
     <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
      // Your template 
      </ViewCell> 
     </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
+0

私の解決策についてどう思いますか? –

+0

5つのアイテムしかない場合、大きな問題ではありません。しかし、私の行動は私の側で働いていると思います。 –

+0

はいできます。私があなたのソリューションをデバッグしたとき、それは私のために働いていましたが、なぜRowHeightが-1になったのか分かりません:/ –

関連する問題