首页 > 解决方案 > Xamarin 表单:当列表视图刷新时,当前列表视图开关状态发生变化?

问题描述

我有一个列表视图,最初显示 20 个用户。每当列表视图底部到达新的 REST API 调用时,就会开始并显示更多用户(20、40、60 等)。加载更多用户时,列表会刷新。

Listview 项目有一个切换选项,如果我按下切换选项,该用户的用户 ID 将添加到列表中。如果我再次按下相同的开关,用户 ID 将从列表中删除。

我的问题是加载更多用户时选定用户的开关将关闭状态。但是列表中保存的userids没有问题,列表中包含了选中用户的id。那么如何在加载更多用户后切换已经选择的用户呢?

标签: listviewxamarin.formsuiswitch

解决方案


从您的 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)

  1. 加载:RestService.GetUsers(0, 20);
  2. 加载:RestService.GetUsers(20, 20);
  3. 加载:RestService.GetUsers(40, 20);
  4. 加载:RestService.GetUsers(60, 20);

然后您可以将结果添加到本地列表中。像这样,您不需要加载过去已经加载的用户。同样通过这样做,您不会遇到状态问题,因为您已经加载的用户不会改变。


推荐阅读