Xamarin 表单:如何从列表视图中隐藏重复的月份名称?

斯瑞吉斯瑞

我的应用程序中有一个事件列表(UI-1,左侧屏幕),那里的月份名称总是重复。

我需要从列表中删除重复的月份名称,并需要像 UI-2(右侧)这样的 UI。

我正在为此功能使用列表视图,以下是我的代码:

就我而言,我需要按月顺序显示我的列表。我在下面添加了我当前的代码:

我的模型类:

public class CalendarEvents
    {
        public List<EventsHB> eventsHB { get; set; }
    }

    public class EventsHB
    {
        public string month { get; set; }
        public EventTO eventTO { get; set; }
    }
    public class EventTO
    { 
        public string calendarEventId { get; set; }
        public string title { get; set; }
        public long startDate { get; set; }
        public string startTime { get; set; }
    }

我的 JSON 响应:

"eventsHB": [
        {
            "eventTO": {
                "calendarEventId": 136,
                "title": " school event",
                "startDate": 1561006800000,
                "startTime": "6:15 PM"
            },
            "month": "July"
        },
        {
            "eventTO": {
                "calendarEventId": 139,
                "title": "New Admission Day"
                "startDate": 1560834000000
                "startTime": "10:00 AM"
            },
            "month": "July"
        },
        {
            "eventTO": {
                "calenderId": 810354,
                "title": "event pta"
                "startDate": 1559710800000,
                "startTime": "10:00 AM"
            },
            "month": "June"
        },
       {
            "eventTO": {
                "calendarEventId": 89,
                "title": "Memorial Day Meet",
                "startDate": 1559365200000,
                "startTime": "8:00 AM"
            },
            "month": "June"
        }
    ]

Xml:

 <ListView x:Name="MyEventsListview"
                      HasUnevenRows="True"
                      ItemsSource="{Binding AllItems,Mode=TwoWay}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <ViewCell.View>

                                <StackLayout
                                    Orientation="Vertical">

                                        <Label 
                                        Text="{Binding month}"/>

                                        <StackLayout
                                Orientation="Horizontal">

                                            <Grid>
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="50*" />
                                                    <ColumnDefinition Width="50*" />
                                                </Grid.ColumnDefinitions>

                                                <StackLayout
                                            Grid.Column="0"
                                            Orientation="Vertical">

                                                    <Label 
                                            Text="{Binding eventTO.startDate,  Converter={StaticResource dayConverter}}"/>

                                                    <Label 
                                            Text="{Binding eventTO.startDate,  Converter={StaticResource dateConverter}}"/>

                                                    <Label 
                                            Text="{Binding eventTO.startTime}"/>
                                                </StackLayout>

                                                <Label 
                                        Text="{Binding eventTO.title}"/>
                                            </Grid>
                                        </StackLayout>
                                </StackLayout>
                            </ViewCell.View>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
              </ListView>

视图模型:

            HttpClient client = new HttpClient();
                var Response = await client.GetAsync("My REST Call");
                if (Response.IsSuccessStatusCode)
                {
                    string response = await Response.Content.ReadAsStringAsync();
                    myevents = new CalendarEvents();
                    if (response != "")
                    {
                        myevents = JsonConvert.DeserializeObject<CalendarEvents>(response.ToString());
                    }
                    AllItems = new ObservableCollection<EventsHB>(myevents.eventsHB);

我不知道需要在模型类、xaml 和 ViewModel 中进行哪些更改才能在月视图中对列表进行分组。任何人都可以提出解决方案提示吗?

Jack Hua

我为您编写了一个示例,以显示在您的情况下显示 Grouped ListView 应该具有的模型和数据:

模型和数据应该是这样的:

public partial class MainPage : ContentPage
{
    public ObservableCollection<EventsHB> AllItems { get; set; }


    public MainPage()
    {
        InitializeComponent();            

        AllItems = new ObservableCollection<EventsHB>();

        var julyGroup = new EventsHB() {month = "july"};

        julyGroup.Add(new EventTO() { calendarEventId = "1", title = "firstTitle", startDate = "01-1-1", startTime = "01-1-1"});
        julyGroup.Add(new EventTO() { calendarEventId = "2", title = "secondTitle", startDate = "02-1-1", startTime = "01-1-2" });
        julyGroup.Add(new EventTO() { calendarEventId = "3", title = "thirdTitle", startDate = "02-1-1", startTime = "01-1-3" });
        julyGroup.Add(new EventTO() { calendarEventId = "4", title = "fourthTitle", startDate = "02-1-1", startTime = "01-1-4" });

        var juneGroup = new EventsHB() { month = "june" };
        juneGroup.Add(new EventTO() { calendarEventId = "1", title = "junefirstTitle", startDate = "01-1-1", startTime = "01-1-1" });
        juneGroup.Add(new EventTO() { calendarEventId = "2", title = "junesecondTitle", startDate = "02-1-1", startTime = "01-1-2" });
        juneGroup.Add(new EventTO() { calendarEventId = "3", title = "junethirdTitle", startDate = "02-1-1", startTime = "01-1-3" });
        juneGroup.Add(new EventTO() { calendarEventId = "4", title = "junefourthTitle", startDate = "02-1-1", startTime = "01-1-4" });

        AllItems.Add(julyGroup);
        AllItems.Add(juneGroup);
        //...
        //more months like April,May can be added

        BindingContext = this;
    }

}

public class EventsHB : ObservableCollection<EventTO>
{
    public string month { get; set; }
    public EventTO eventTO { get; set; }
}

public class EventTO
{
    public string calendarEventId { get; set; }
    public string title { get; set; }
    public string startDate { get; set; }
    public string startTime { get; set; }
}

在你的json数据中,数据结构似乎不符合我在我的示例中列出的结构,所以你要做的就是将你的数据转换为正确的结构,我写了一个测试函数,你可以检查它是否有效:

//A test function to convert you json array to the array we need
    void test()
    {

        EventsHB julyGroup = new EventsHB() { month = "july" }; ;
        EventsHB juneGroup = new EventsHB() { month = "june" };
        //other months group


        foreach (var item in AllItems)
        {
            EventsHB hb = item;
            if (hb.month == "july")
            {
                julyGroup.Add(hb.eventTO);
            }
            else if (hb.month == "june")
            {
                juneGroup.Add(hb.eventTO);
            }//...other months
        }

        //at last, add them to All items.
        AllItems.Add(julyGroup);
        AllItems.Add(juneGroup);
        //...add other months
    }

你可以用你自己的方式转换它。

示例在这里:grouped-listView

参考:customizing-list-appearance#grouping

更新:

在应用程序端转换数据结构真的很复杂,我为你转换它并在我更新项目代码的每个地方添加注释。

你得到异常的原因是因为模型EventsHB : ObservableCollection<EventTO>,所以我在这里创建了一个新的来反序列化 json。

public class CalendarEvents
{
    //update here: here should be List<EventsHBTwo>
    public List<EventsHBTwo> eventsHB { get; set; }
}

//update use this one to shou grouped list data
public class EventsHB : ObservableCollection<EventTO>
{
    public string month { get; set; }
    public EventTO eventTO { get; set; }
}

//Update: use this one to deserialize json
public class EventsHBTwo
{
    public string month { get; set; }
    public EventTO eventTO { get; set; }
}

在 ViewModel.cs 中:

//Update: add a new tempItem to get json data
public ObservableCollection<EventsHBTwo> tempItem
{
    get
    {
        return _tempItems;
    }
    set
    {
        _tempItems = value;
        OnPropertyChanged("tempItem");
    }
}

然后使用这个 tempItem 来获取 json 数据:

   tempItem = new ObservableCollection<EventsHBTwo>(myevents.eventsHB);    
   //update: converData here 
   converData(tempItem);

和转换功能:

public void converData(ObservableCollection<EventsHBTwo> allItem)
        {

            AllItems = new ObservableCollection<EventsHB>();

            EventsHB julyGroup = new EventsHB() { month = "July" };
            EventsHB juneGroup = new EventsHB() { month = "June" };

            foreach (var item in allItem)
            {
                EventsHBTwo hb = item;
                if (hb.month == "July")
                {
                    julyGroup.Add(hb.eventTO);
                }
                else if (hb.month == "June")
                {
                    juneGroup.Add(hb.eventTO);
                }
            }

            //at last, add them to All items.
            AllItems.Add(julyGroup);
            AllItems.Add(juneGroup);
        }

最后在 xaml 中,在此处添加 IsGroupingEnabled GroupShortNameBinding GroupDisplayBinding:

<ListView x:Name="MyEventsListview"
                      RefreshCommand="{Binding RefreshCommand}"
                      IsRefreshing="{Binding IsRefreshing}"
                      IsPullToRefreshEnabled="True"
                      HasUnevenRows="True"
                      ItemsSource="{Binding AllItems,Mode=TwoWay}"
                      BackgroundColor="White"
                      IsGroupingEnabled="True"
                      GroupDisplayBinding="{Binding month}"
                      GroupShortNameBinding="{Binding month}">

并直接使用 startDate startTime 而不是 eventTO.startDate。

我在这里上传了我的示例,您可以查看它:working-grouped-listView-xamarin.forms

实现此目的的最佳方法是要求您的服务端为您提供这样的 json:

{"eventsHB":
    {july:[

        {"eventTO":{"calendarEventId":135,}}

        {"eventTO":{"calendarEventId":135,}}

        {"eventTO":{"calendarEventId":135,}}

        {"eventTO":{"calendarEventId":135,}}
    }

    {june:[

        {"eventTO":{"calendarEventId":135,}}

        {"eventTO":{"calendarEventId":135,}}

        {"eventTO":{"calendarEventId":135,}}

        {"eventTO":{"calendarEventId":135,}}

         ]
    }
    ...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Xamarin表单:在列表视图中获得控制

来自分类Dev

Xamarin表单:在列表视图中获得控制

来自分类Dev

如何在xamarin的列表视图中使用OnItemLongClick

来自分类Dev

如何通过单击数据模板列表视图中的项目来打开另一个xamarin表单页面?

来自分类Dev

如何在Xamarin表单中动态设置列表视图中项目的元素可见性

来自分类Dev

如何检测 xamarin 表单中的列表视图滚动方向

来自分类Dev

Xamarin:更改列表视图中的标签文本

来自分类Dev

Xamarin 表单 Web 视图

来自分类Dev

Xamarin 表单:如何检查浏览器是否在我的 web 视图中成功打开

来自分类Dev

如何在 xamarin 表单 Web 视图中创建新选项卡

来自分类Dev

如何在滚动视图Xamarin表单中隐藏滚动条?

来自分类Dev

如何基于列表视图Xamarin表单中的类别对列表进行分组

来自分类Dev

如何在Xamarin Forms的列表视图中的多个项目中添加图像单元格

来自分类Dev

我如何通过xaml(xamarin.forms)在列表视图中的分组之间获取空间

来自分类Dev

Android C#Xamarin。如何在列表视图中显示关联的表?

来自分类Dev

如何在Xamarin Forms的列表视图中的多个项目中添加图像单元格

来自分类Dev

如何使用活动指示器直到列表视图加载 xamarin 表单

来自分类Dev

Xamarin 表单:如何将列表视图滚动行为更改为从下到上?

来自分类Dev

如何将从相机拍摄的图像添加到列表视图?Xamarin 表单

来自分类Dev

Xamarin表单列表视图显示框架中的行项目

来自分类Dev

Xamarin 表单中列表视图的粘性标签(标题)

来自分类Dev

Xamarin 表单列表视图项未完全显示

来自分类Dev

Xamarin Forms动态列表视图

来自分类Dev

xamarin 列表视图未填充

来自分类Dev

如何在导航栏Xamarin表单中隐藏后退按钮

来自分类Dev

在Xamarin iOS中单击tableview委托时如何隐藏视图?

来自分类Dev

Xamarin Forms:从饼图中删除或隐藏 LinearAxis

来自分类Dev

Xamarin 从列表视图加载列表视图

来自分类Dev

如何在Xamarin表单上创建和重复动画

Related 相关文章

  1. 1

    Xamarin表单:在列表视图中获得控制

  2. 2

    Xamarin表单:在列表视图中获得控制

  3. 3

    如何在xamarin的列表视图中使用OnItemLongClick

  4. 4

    如何通过单击数据模板列表视图中的项目来打开另一个xamarin表单页面?

  5. 5

    如何在Xamarin表单中动态设置列表视图中项目的元素可见性

  6. 6

    如何检测 xamarin 表单中的列表视图滚动方向

  7. 7

    Xamarin:更改列表视图中的标签文本

  8. 8

    Xamarin 表单 Web 视图

  9. 9

    Xamarin 表单:如何检查浏览器是否在我的 web 视图中成功打开

  10. 10

    如何在 xamarin 表单 Web 视图中创建新选项卡

  11. 11

    如何在滚动视图Xamarin表单中隐藏滚动条?

  12. 12

    如何基于列表视图Xamarin表单中的类别对列表进行分组

  13. 13

    如何在Xamarin Forms的列表视图中的多个项目中添加图像单元格

  14. 14

    我如何通过xaml(xamarin.forms)在列表视图中的分组之间获取空间

  15. 15

    Android C#Xamarin。如何在列表视图中显示关联的表?

  16. 16

    如何在Xamarin Forms的列表视图中的多个项目中添加图像单元格

  17. 17

    如何使用活动指示器直到列表视图加载 xamarin 表单

  18. 18

    Xamarin 表单:如何将列表视图滚动行为更改为从下到上?

  19. 19

    如何将从相机拍摄的图像添加到列表视图?Xamarin 表单

  20. 20

    Xamarin表单列表视图显示框架中的行项目

  21. 21

    Xamarin 表单中列表视图的粘性标签(标题)

  22. 22

    Xamarin 表单列表视图项未完全显示

  23. 23

    Xamarin Forms动态列表视图

  24. 24

    xamarin 列表视图未填充

  25. 25

    如何在导航栏Xamarin表单中隐藏后退按钮

  26. 26

    在Xamarin iOS中单击tableview委托时如何隐藏视图?

  27. 27

    Xamarin Forms:从饼图中删除或隐藏 LinearAxis

  28. 28

    Xamarin 从列表视图加载列表视图

  29. 29

    如何在Xamarin表单上创建和重复动画

热门标签

归档