簡體   English   中英

列表視圖頁面上的無限滾動

[英]Infinite Scroll on Listview page

我有一個列表視圖,其數據是從服務器上的 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”是數據= 0時將顯示的文本

如何防止顯示“statuskosong”並且不再加載數據?

可以在每次調用ProgressQuiz方法時設置statusKosong.VisibilityCollapsed ,然后在檢測到quizhomedatasource.Count為0時顯示。

對了,你在ProgressQuiz方法最后的判斷條件是quizhomedatasource.Count < 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):

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM