Формы Xamarin: Как скрыть повторяющееся название месяца из списка? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть список событий в моем приложении (UI-1, левый боковой экран), там название месяца повторяется всегда.

Мне нужно удалить повторяющееся название месяца из списка, и мне нужен такой интерфейс, как UI-2 (справа).

Я использую список для этой функции, и мой код следующий:

В моем случае мне нужно показать мой список в порядке по месяцам. Я добавил свои текущие коды ниже:

Класс моей модели:

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"
        }
    ]

Xaml:

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

ViewModel:

            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, чтобы сгруппировать список в виде месяца. Может кто-нибудь предложить подсказки решения?

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Я напишу пример для вас, чтобы показать, какую модель и данные вам нужно для отображения сгруппированного списка в вашем случае:

Модель и данные должны быть примерно такими:

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-внешний вид # группировка

Обновление:

Действительно сложно преобразовать структуру данных на стороне приложения, я конвертирую ее для вас и добавляю комментарии каждый раз, когда обновляю код в проекте.

Причина, по которой вы получаете исключение, заключается в том, что модель 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,}}

         ]
    }
    ...
}
1 голос
/ 08 июня 2019

Вам необходимо сгруппировать ваш ListView по месяцам. ListView предоставляет свойство с именем «IsGroupingEnabled», которое необходимо установить в True.

Затем вам нужно установить GroupHeaderTemplate объекта ListView следующим образом:

<ListView.GroupHeaderTemplate>
    <DataTemplate>
         <ViewCell Height="45">
             <Grid Padding="10" BackgroundColor="WhiteSmoke">
                 <Label Text="{Binding Key}" FontSize="18"/>
             </Grid>
         </ViewCell>
    </DataTemplate>
</ListView.GroupHeaderTemplate>

Просмотрите мою простую группировку Страница Xaml и ViewModel

В моем примере я сгруппировал по категориям, но в вашем случае вы должны установить Месяц в качестве ключа группы.

Вы можете попробовать весь мой образец из Github

...