2017-05-23 138 views
0

我知道ExpandableListView,但只要我能看到ExpandableListView有一个项目列表作为子项目。 我想要做的是有一个父项目列表,当我点击一个父项目时,它展开并显示更多信息。可扩展列表项目布局

注意:父项展开时显示的布局不是列表。这只是一个简单的布局,并且因为在我看到的每个示例中,ExpandableListView都与List一起用作子项,所以我不确定它是否是在这种情况下使用的正确控件。

可能的解决办法:我可以使用ExpandableListView并在列表中只有一个子项,但我正在寻找的东西更优雅,而不是与中只有一个项目的列表。

ExpandableListView是在此使用的正确控件吗?

编辑:我使用Xamarin母语(Xamarin.Android),不Xamarin.Forms

Expandable View

回答

0

,我不会建议使用可扩展的ListView,因为它可能会导致性能问题时,有更多数据。

但是,如果你想实现它遵循以下步骤:

  1. 你的模型应该像列表列表内

    public class Model1 { public string Name { get; set; } public List<Model2> Model2Name { get; set; } } public class Model2 { public string Name1 { get; set; } }

    在此处输入代码

然后你的XAML应该像

<ListView 
HasUnevenRows="True" 
ItemSelected="ItemSelected" 
ItemsSource="{Binding DataList}"> 
<ListView.ItemTemplate> 
<DataTemplate> 
<ViewCell> 
<Grid > 
<Grid.RowDefinitions> 
<RowDefinition Height="Auto"/> 
<RowDefinition Height="Auto"/> 
</Grid.RowDefinitions> 
<Grid.ColumnDefinitions> 
<ColumnDefinition Width="9*"/> 
</Grid.ColumnDefinitions> 
<Label Grid.Row="0" Text="{Binding Name}" YAlign="Center"/> 
<ListView Grid.Row="1" 
IsVisible="{Binding ListVisibility}" 
SeparatorVisibility="None" 
ItemSelected="ProductSelected" 
HeightRequest="220" 
BackgroundColor="#f2f2f2" 
HorizontalOptions="FillAndExpand" 
ItemsSource="{Binding Model.Products}"> 
<ListView.ItemTemplate> 
<DataTemplate> 
<ViewCell> 
<Grid > 
<Grid.RowDefinitions> 
<RowDefinition Height="Auto"/> 
<RowDefinition Height="Auto"/> 
</Grid.RowDefinitions> 
<Label Grid.Row="0" Grid.Column="0" Text="{Binding Name}" 
YAlign="Center" /> 
</Grid> 
</ViewCell> 
</DataTemplate> 
</ListView.ItemTemplate> 
</ListView> 
</Grid> 
</ViewCell> 
</DataTemplate> 
</ListView.ItemTemplate> 
</ListView>

现在你必须包装你的模型。对于你必须写一个包装类如下:

public class WrapperModel<T> : INotifyPropertyChanged 
{ 
    public T Model { get; set; } 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
    bool listVisibility = false; 
    public bool ListVisibility 
    { 
     get 
     { 
      return listVisibility; 
     } 
     set 
     { 
      if (listVisibility != value) 
      { 
       listVisibility = value; 
       PropertyChanged(this, new PropertyChangedEventArgs("ListVisibility")); 
      } 
     } 
    } 
} 

现在,在视图模型,你必须声明你的列表属性如下:

private List<WrapperModel<ProductCategoryModel>> dataList; 
    public List<WrapperModel<ProductCategoryModel>> DataList 
    { 
     get { return dataList; } 
     set 
     { 
      dataList = value; 
      OnPropertyChanged("DataList"); 
     } 
    } 

现在初始化列表如下:

foreach (var item in List) 
{ 
DataList.Add(new WrapperModel<ModelName> 
{ Model = item, ListVisibility = false}); 
         } 

现在列表将处于折叠状态。要获得点击每个项目内部列表,你必须设置ItemSelected如下:

private void ItemSelected(object sender, SelectedItemChangedEventArgs e) 
    { 
     if (e.SelectedItem == null) return; 

     var tappedItem = (WrapperModel<ModelName>)e.SelectedItem; 
     tappedItem.ListVisibility = !tappedItem.ListVisibility; 
     ((ListView)sender).SelectedItem = null; 
    } 

如果您有疑问,请让我知道