【问题标题】:Infinite Scroll on Listview pageListview 页面上的无限滚动
【发布时间】:2021-02-09 07:51:26
【问题描述】:

我有一个列表视图,它的数据是从服务器上的 json 获取的。 代码:

ObservableCollection<QuizHome> quizhomedatasource = new ObservableCollection<QuizHome>();
private bool incall = false, endoflist = false;
int offset = 1, halaman = 1;
private void MainGrid_Loaded(object sender, RoutedEventArgs e)
        {
            quizhomedatasource.Clear();
            QuizList.ItemsSource = quizhomedatasource;
            ProgressQuiz(offset);
        }
private void QuizList_Loaded(object sender, RoutedEventArgs e)
        {
            ScrollViewer viewer = GetScrollViewer(this.QuizList);
            viewer.ViewChanged += Viewer_ViewChanged;
        }

        private void Viewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
        {
            ScrollViewer view = (ScrollViewer)sender;
            double progress = view.VerticalOffset / view.ScrollableHeight;
            if (progress > 0.7 && !endoflist)
            {
                incall = true;
                while (offset < halaman)
                {
                    ProgressQuiz(++offset);
                }
            }
            else
            {
                incall = false;
            }
        }

        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;
        }
private async void ProgressQuiz(int offset)
        {
                        try
                        {
                                urlPath = "https://mhnkp2.com/school/api-v3/fetch/tryout_paket_perkelas";
                                var values = new List<KeyValuePair<string, string>>
                                {
                                    new KeyValuePair<string, string>("halaman", offset.ToString()),
                                    new KeyValuePair<string, string>("limit", "10"),
                                    new KeyValuePair<string, string>("kelas", "2")
                                };
                                var httpClient = new HttpClient(new HttpClientHandler());
                                httpClient.DefaultRequestHeaders.TryAddWithoutValidation("SCH-API-KEY", "SCH_KEnaBiDeplebt");
                                httpClient.DefaultRequestHeaders.TryAddWithoutValidation("token", token.Token);
                                var response = await httpClient.PostAsync(urlPath, new FormUrlEncodedContent(values));
                                response.EnsureSuccessStatusCode();
                                string jsonText = await response.Content.ReadAsStringAsync();
                            try
                            {
                                JsonObject jsonObject = JsonObject.Parse(jsonText);
                                JsonObject groupObject1 = jsonObject.GetObject();                                        
                                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);
                                    halaman = file.Pages;
                                    JsonArray jsonData1 = jsonObject["data"].GetArray();
                                    foreach (JsonValue groupValue1 in jsonData1)
                                    {
                                        JsonObject groupObject2 = groupValue1.GetObject();
                                        string title = groupObject2["judul"].GetString();

                                        QuizHome quiz = new QuizHome();
                                        quiz.Title = title;
                                        quizhomedatasource.Add(quiz);
                                    }
                                    if (quizhomedatasource.Count < 0)
                                    {
                                        QuizList.Visibility = Visibility.Collapsed;
                                        statusKosong.Visibility = Visibility.Visible;
                                    }
                                }
                            }

我有一个问题,如果加载的页面超过页数,则显示“statuskosong”。如何防止“statuskosong”显示和数据不再加载?

注意:

  • “statuskosong”是data = 0时显示的文本

【问题讨论】:

    标签: c# json listview uwp infinite-scroll


    【解决方案1】:

    如何防止“statuskosong”显示和数据不再加载?

    可以在每次调用ProgressQuiz方法时将statusKosong.Visibility设置为Collapsed,当检测到quizhomedatasource.Count为0时显示。

    对了,你在ProgressQuiz方法最后的判断条件是quizhomedatasource.Count &lt; 0,不会出现这种情况,你可以改成quizhomedatasource.Count == 0

    关于避免重复请求,我们可以在Viewer_ViewChanged回调中增加新的判断条件,并将ProgressQuiz方法的返回值设置为Task

    private async void Viewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
    {
         ScrollViewer view = (ScrollViewer)sender;
         double progress = view.VerticalOffset / view.ScrollableHeight;
         if (progress > 0.7 && !endoflist && !incall)
         {
             incall = true;
             while (offset < halaman)
             {
                 await ProgressQuiz(++offset);
             }
         }
         else
         {
             incall = false;
         }
    }
    
    private async Task ProgressQuiz(int offset)
    {
        //code
    }
    

    通过判断incall,等待ProgressQuiz方法执行,可以避免重复请求。


    根据您提供的代码,您正在创建一个增量加载列表。

    通过VisualTreeHelper 获取ListView 中的ScrollViewer 并附加事件是一种解决方法,但UWP 提供了另一种更优雅地解决增量加载问题的方法(来自Windows Community Toolkit):

    【讨论】:

    • 我已将 async 添加到 private void Viewer_ViewChanged (object sender, ScrollViewerViewChangedEventArgs e) 并将 await 添加到 ProgressQuiz (offset ++),但出现错误消息:Cannot await 'void'
    • 您好,请注意ProgressQuiz方法的返回值需要改为Task
    • 你好@Rose,你的问题解决了吗?如果您对此有任何疑问,请随时提出。
    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多