首页 文章

Xamarin表单SearchBar ListView缓慢更新

提问于
浏览
0

我想帮助加快过滤一长列表项并在ListView上查看它们的过程 .

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

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

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

我相信每次过滤列表更新时,花费大量时间来充斥大量ViewCell .

你们中的任何人都知道如何加快这个过程吗?我认为它的工作方式是拥有非常有限数量的ViewCells(如10或20),然后让它们更新,只显示筛选列表的选择 . 滚动将重复使用顶部/底部,更新内容并将其放回到底部/顶部 - 但我无法绕过如何执行此操作 .

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

1 回答

  • 0

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

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

    我无法理解为什么会这么慢 . 我发现了一种具有更多开销的不同方法,由于某种原因,它更快,响应更快,并且对用户来说整体感觉更好 . 我的 ListView 总是 ObservableCollectionItemsSource . 当我过滤我计算这个 ObservableCollection (额外的项目和删除的项目)的差异,然后删除或相应添加 . 这样可以避免替换 ItemsSource 上看起来太苛刻的 ItemsSource 属性 .

    //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 而导致 IllegalArgumentException 的变化 .

    • 如果有人知道一个好的可过滤的可观察集合,那可能是一个更好的解决方案 .

相关问题