c# - Listview 页面上的无限滚动
问题描述
我有一个列表视图,其数据是从服务器上的 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 时将显示的文本
解决方案
如何防止显示“statuskosong”并且不再加载数据?
您可以在每次调用该方法时设置statusKosong.Visibility
为Collapsed ,然后在检测到为 0ProgressQuiz
时显示它。quizhomedatasource.Count
对了,你在ProgressQuiz方法最后的判断条件是quizhomedatasource.Count < 0
,不会出现这种情况,可以改成quizhomedatasource.Count == 0
关于避免重复请求,我们可以在回调中增加新的判断条件,并将方法Viewer_ViewChanged
的返回值设置为Task:ProgressQuiz
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
方法执行,可以避免重复请求。
根据您提供的代码,您正在创建一个增量加载的列表。
ScrollViewer
通过在 ListView 中获取VisualTreeHelper
并附加事件是一种解决方法,但 UWP 提供了另一种更优雅地解决增量加载问题的方法(来自 Windows Community Toolkit):
推荐阅读
- css - 如何在不同的反应组件之间重用样式组件?
- asp.net-core - 连接返回重复值
- python - python manage.py runserver 发现 0 个问题,但有错误
- php - 选择什么常数来比较 fmod 函数的结果
- android - 从 SearchView onQueryTextSubmit 创建时视图不显示
- session - 我在我的 laravel 应用程序上收到一条错误消息:从空值创建默认对象
- python - 是否可以将 RGB 图像转换为索引颜色,以便每个索引颜色对应于 Python 中矩阵形式的正确 RGB 颜色?
- google-colaboratory - 在 Google Colabs 中使用 Timer 模块时答案不正确
- tibco-ems - Neoload如何连接tibco服务器。获取无法实例化类:om.tibco.tibjms.TibjmsQueueConnectionFactory 错误
- c# - 落地时失去生命