Ленивая загрузка gridview от json - PullRequest
0 голосов
/ 10 февраля 2020

У меня отложенная загрузка в gridview, данные которого взяты из JSON.

Образец JSON:

{
    "error": false,
    "total_data": 32,
    "data_per_page": "16",
    "current_page": 1,
    "total_page": 2,
    "current_total": 16,
    "data": [
        {
            "id": "2613",
            "judul": "Kamus ID EN",
            "slug": "kamus-id-en",
            "cover": "https://mhnkp2.com/src/umum/cover/kamus_ID_EN-thumb.jpg",
            "path": "https://mhnkp2.com/school/dl/dodl/2613",
            "ukuran": "3504835",
            "formated_size": "3.34 MB",
            "fname": "kamus_ID_EN.pdf",
            "publish": "1",
            "urgent": "400",
            "kelas": "0",
            "nama_kelas": "Umum"
        },

XAML:

<Grid x:Name="content" Grid.Row="1" Loaded="MainGrid_Loaded">

            <GridView
                x:Name="itemGridView"
                Loaded="itemGridView_Loaded">

                <GridView.ItemTemplate>
                    <DataTemplate>
                        <Grid
                            Width="135"
                            Height="280"
                            Margin="5,5,5,5"
                            Background="White">
                                <TextBlock
                                    x:Name="title"
                                    Margin="0,0,10,10"
                                    FontSize="14"
                                    FontWeight="SemiBold"
                                    Foreground="Black"
                                    Style="{StaticResource TitleTextBlockStyle}"
                                    Text="{Binding Judul}"
                                    TextWrapping="Wrap" />
                        </Grid>
                    </DataTemplate>
                </GridView.ItemTemplate>
            </GridView>

Код:

ObservableCollection<Buku> datasource = new ObservableCollection<Buku>();
int offset = 0;
        private void MainGrid_Loaded(object sender, RoutedEventArgs e)
                    {
                        itemGridView.ItemsSource = datasource;
                        Umum(1);
                    } 
    public class Buku
        {
            public string Judul { get; set; }
        }

            private async void Umum(int offset)
            {
                urlPath = "https://mhnkp2.com/school/api-v3/fetch/umum";
                var httpClient = new HttpClient(new HttpClientHandler());
                var values = new List<KeyValuePair<string, string>>
                {
                    new KeyValuePair<string, string>("halaman", offset.ToString()),
                    new KeyValuePair<string, string>("limit", "16"),
                    new KeyValuePair<string, string>("SCH-API-KEY", "SCH_KEnaBiDeplebt")
                };

                var response = await httpClient.PostAsync(urlPath, new FormUrlEncodedContent(values));
                response.EnsureSuccessStatusCode();
                string jsonText = await response.Content.ReadAsStringAsync();
                try
                {
                    double total = groupObject1["total_data"].GetNumber();
                    double pages = groupObject1["total_page"].GetNumber();
                    double page = groupObject1["current_page"].GetNumber();

                    Buku file = new Buku();
                    file.PageNo = Convert.ToInt32(page);
                    file.Pages = Convert.ToInt32(pages);
                    file.Total = Convert.ToInt32(total);
                    JsonArray jsonData1 = jsonObject["data"].GetArray();
                    foreach (JsonValue groupValue1 in jsonData1)
                    {
                        JsonObject groupObject2 = groupValue1.GetObject();
                        string title = groupObject2["judul"].GetString();

                        Buku file1 = new Buku();
                        file1.Judul = title;
                        datasource.Add(file1);
                    }
                    itemGridView.ItemsSource = datasource;
                }
            }

            private void itemGridView_Loaded(object sender, RoutedEventArgs e)
                    {
                        ScrollViewer viewer = GetScrollViewer(this.itemGridView);
                        viewer.ViewChanged += Viewer_ViewChanged;
                    }

                    private void Viewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
                    {
                        ScrollViewer view = (ScrollViewer)sender;
                        double progress = view.VerticalOffset / view.ScrollableHeight;
                        //Debug.WriteLine(progress);
                        if (progress > 0.7 && !incall && !endoflist)
                        {
                            incall = true;
                            busyindicator.IsActive = true;
                            Umum(++offset);
                        }
                    }

                    public static ScrollViewer GetScrollViewer(DependencyObject depObj)
                    {
                        if (depObj is ScrollViewer) return depObj as ScrollViewer;

                        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                        {
                            var child = VisualTreeHelper.GetChild(depObj, i);
                            var result = GetScrollViewer(child);
                            if (result != null) return result;
                        }
                        return null;
                    }

У меня проблема с тем, что в виде сетки должны отображаться данные на страницах 1 и 2, но в виде сетки данные, отображаемые на странице 2, являются повторением данных на странице 1, так как показано ниже: picture Как это исправить?

Примечание:

  • На странице используется параметр «смещение»

  • Предел страницы "total_page" в JSON

1 Ответ

0 голосов
/ 10 февраля 2020

вам просто нужно передать значение смещения на MainGrid_Loaded и установить смещение на ноль на единицу

ObservableCollection<Buku> datasource = new ObservableCollection<Buku>();
int offset = 1; // set offset zero to one 
        private void MainGrid_Loaded(object sender, RoutedEventArgs e)
                    {
                        itemGridView.ItemsSource = datasource;
                        Umum(offset); // just change 1 to offset 
                    } 
    public class Buku
        {
            public string Judul { get; set; }
        }

            private async void Umum(int offset)
            {
                urlPath = "mhnkp2.com/school/api-v3/fetch/ktsp2006/kelas/1";
                var httpClient = new HttpClient(new HttpClientHandler());
                var values = new List<KeyValuePair<string, string>>
                {
                    new KeyValuePair<string, string>("halaman", offset.ToString()),
                    new KeyValuePair<string, string>("limit", "16"),
                    new KeyValuePair<string, string>("SCH-API-KEY", "SCH_KEnaBiDeplebt")
                };

                var response = await httpClient.PostAsync(urlPath, new FormUrlEncodedContent(values));
                response.EnsureSuccessStatusCode();
                string jsonText = await response.Content.ReadAsStringAsync();
                try
                {
                    double total = groupObject1["total_data"].GetNumber();
                    double pages = groupObject1["total_page"].GetNumber();
                    double page = groupObject1["current_page"].GetNumber();

                    Buku file = new Buku();
                    file.PageNo = Convert.ToInt32(page);
                    file.Pages = Convert.ToInt32(pages);
                    file.Total = Convert.ToInt32(total);
                    JsonArray jsonData1 = jsonObject["data"].GetArray();
                    foreach (JsonValue groupValue1 in jsonData1)
                    {
                        JsonObject groupObject2 = groupValue1.GetObject();
                        string title = groupObject2["judul"].GetString();

                        Buku file1 = new Buku();
                        file1.Judul = title;
                        datasource.Add(file1);
                    }
                    itemGridView.ItemsSource = datasource;
                }
            }

            private void itemGridView_Loaded(object sender, RoutedEventArgs e)
                    {
                        ScrollViewer viewer = GetScrollViewer(this.itemGridView);
                        viewer.ViewChanged += Viewer_ViewChanged;
                    }

                    private void Viewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
                    {
                        ScrollViewer view = (ScrollViewer)sender;
                        double progress = view.VerticalOffset / view.ScrollableHeight;
                        //Debug.WriteLine(progress);
                        if (progress > 0.7 && !incall && !endoflist)
                        {
                            incall = true;
                            busyindicator.IsActive = true;
                            Umum(offset++);
                        }
                    }

                    public static ScrollViewer GetScrollViewer(DependencyObject depObj)
                    {
                        if (depObj is ScrollViewer) return depObj as ScrollViewer;

                        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                        {
                            var child = VisualTreeHelper.GetChild(depObj, i);
                            var result = GetScrollViewer(child);
                            if (result != null) return result;
                        }
                        return null;
                    }
...