listview - Xamarin 表单:当列表视图刷新时,当前列表视图开关状态发生变化?
问题描述
我有一个列表视图,最初显示 20 个用户。每当列表视图底部到达新的 REST API 调用时,就会开始并显示更多用户(20、40、60 等)。加载更多用户时,列表会刷新。
Listview 项目有一个切换选项,如果我按下切换选项,该用户的用户 ID 将添加到列表中。如果我再次按下相同的开关,用户 ID 将从列表中删除。
我的问题是加载更多用户时选定用户的开关将关闭状态。但是列表中保存的userids没有问题,列表中包含了选中用户的id。那么如何在加载更多用户后切换已经选择的用户呢?
解决方案
从您的 REST 服务接收用户时,每个开关的状态为false
. 所以你需要保存你的本地列表。然后您需要检查您的主键以查看哪些用户拥有state = true
.
伪代码:
var oldUsersList = new List<User>(UsersList);
UsersList = await RestService.GetUsers();
foreach (var user in oldUsersList)
{
if (user.State)
{
UsersList.FirstOrDefault(u => u.UserId == user.UserId).State = true;
}
}
但是你做错了延迟加载!
您加载新项目的方式完全破坏了您想要进行延迟加载的原因。您想做延迟加载(= 在需要项目时加载),因为您不需要一次加载这么多数据。但是您总是会再次加载所有项目。
您应该做的是始终只加载 20 个项目。然后将这 20 项添加到您的本地列表中。
为此,您需要能够使用 offset 和 limit 作为参数来调用 REST API。
例如:RestService.GetUsers(long offset, long limit)
- 加载:
RestService.GetUsers(0, 20);
- 加载:
RestService.GetUsers(20, 20);
- 加载:
RestService.GetUsers(40, 20);
- 加载:
RestService.GetUsers(60, 20);
然后您可以将结果添加到本地列表中。像这样,您不需要加载过去已经加载的用户。同样通过这样做,您不会遇到状态问题,因为您已经加载的用户不会改变。
推荐阅读
- python - 如何在不更改格式样式的情况下使用 python 和 python-docx 替换文档中的单词?
- java - 在反序列化阶段将一条记录划分为多条
- regex - ansible 用 jinja2 裁剪子字符串
- android - 如何添加应用程序防护以防止对 Flutter 应用程序进行逆向工程(就像在 Android 中所做的那样)?
- python - pandas 根据多个条件替换 np.nan
- python - 如何在数据框中按组对行进行排序
- karate - 当我尝试使用空手道机器人自动化记事本时,荧光笔未检测到
- powershell - 通过 ADO 管道执行 PowerShell Selenium 脚本时面临代理问题:远程服务器返回错误:(403)禁止
- amazon-web-services - Terraform 输入变量的最佳解决方案?
- reactjs - 在特定页面中反应隐藏菜单和页脚