【问题标题】:Xamarin Forms SearchBar + ListView slow to updateXamarin Forms SearchBar + ListView 更新缓慢
【发布时间】:2018-10-13 00:42:01
【问题描述】:

我需要一些帮助来加快过滤一长串列表项并在 ListView 上查看它们的过程。

我的应用程序有一个搜索栏、一个 ListView 和一个很长的字符串列表可供选择。

当用户输入搜索词时,ListView 会随着每次击键而更新,并过滤掉不相关的项目。

排序本身需要几毫秒,但之后使用新的过滤器事件更新 ListView 需要很长时间(如果只输入了一个字符作为搜索条件,则只需 20 秒)

我相信每次过滤列表更新时都会花费大量时间来膨胀大量 ViewCell。

你们中有人知道如何加快这个过程吗?我认为它的工作方式是拥有非常有限数量的 ViewCell(如 10 个或 20 个),然后让它们更新并仅显示过滤列表的选择。滚动将重用顶部/底部,更新内容并将其放回底部/顶部 - 但我无法弄清楚如何做到这一点。

也许这是错误的方法,您知道更好的方法吗?

【问题讨论】:

  • 请分享相关代码
  • 另外,您的列表视图中有多少项?因为我做了类似的事情,并且几乎没有任何延迟,它对大约 200-300 个项目非常有效。

标签: forms listview xamarin optimization searchbar


【解决方案1】:

我刚刚遇到了一个类似的问题,我的列表只有 20 个元素,搜索速度非常慢。也许你的问题是相似的。可悲的是,您没有发布任何代码。我有这样的事情:

List l = originalItems.Where((i) => i.Name.Contains(filterText));
listView.ItemsSource = l;

我不明白为什么会这么慢。我发现了一种不同的方法,它的开销更大,由于某种原因,它更快、响应更快,并且总体上对用户来说感觉更好。我的ListView 总是有一个ObservableCollection 作为ItemsSource。当我过滤时,我会计算与 ObservableCollection(额外项目和已删除项目)的差异,然后相应地删除或添加。这避免了替换ItemsSource 属性,这似乎对ListView 过于苛刻。

//property of the class
ObservableCollection<FlightListItem> listViewItems;
// ....
//somewhere at initialization
listView.ItemsSoure = listViewItems;
// ....
//in the filter method:
List l = originalItems.Where((i) => i.Name.Contains(filterText));
IEnumerable itemsToAdd = l.Except(listViewItems).ToList();
IEnumerable itemsToRemove = listViewItems.Except(l).ToList();
listView.BeginRefresh();
foreach (FlightListItem item in removes)
    listViewItems.Remove(item);
foreach (FlightListItem item in added)
    listViewItems.Add(item);
listView.EndRefresh();

注意事项:

  • 删除 listView.BeginRefresh()EndRefresh() 似乎不会影响性能,但在这里调用它们似乎是正确的。
  • 我们需要在itemsToAdditemsToRemove 上致电ToList(),即使我们只需要IEnumerables!这是因为Except 是一个惰性操作,否则只会在 for 循环期间进行评估。然而,在 for 循环中,由于在检查 IEnumerable 时修改了 IEnumerable 而导致出现 IllegalArgumentException 的参数之一发生了变化。
  • 如果有人知道一个好的可过滤可观察集合,那可能是一个更好的解决方案。

【讨论】:

    猜你喜欢
    • 2019-04-23
    • 2016-10-03
    • 1970-01-01
    • 2020-12-21
    • 2018-10-16
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多