可扩展列表项布局

时间:2017-05-23 20:57:54

标签: android xamarin mobile xamarin.android expandablelistview

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

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

可能的解决方案:我可以使用ExpandableListView并且列表中只有一个子项,但是我寻找的东西比只有一个项目的列表更优雅

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

编辑:我使用的是Xamarin Native(Xamarin.Android),而不是Xamarin.Forms

Expandable View

1 个答案:

答案 0 :(得分: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; } }

    在此输入代码

  2. 然后你的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"));
                }
            }
        }
    }
    

    现在在viewModel中,您必须按如下方式声明List属性:

    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;
        }
    

    如果您有疑问,请告诉我