我想帮助加快过滤一长列表项并在ListView上查看它们的过程 .
我的应用程序有一个搜索栏,一个ListView和一个很长的字符串列表可供选择 .
当用户输入搜索词时,ListView会随每个键击更新并过滤掉不相关的项目 .
排序本身需要几毫秒,但之后使用新的过滤器事件更新ListView需要很长时间(如果只输入一个字符作为搜索条件,则需要20秒)
我相信每次过滤列表更新时,花费大量时间来充斥大量ViewCell .
你们中的任何人都知道如何加快这个过程吗?我认为它的工作方式是拥有非常有限数量的ViewCells(如10或20),然后让它们更新,只显示筛选列表的选择 . 滚动将重复使用顶部/底部,更新内容并将其放回到底部/顶部 - 但我无法绕过如何执行此操作 .
也许这是错误的方法,你知道更好的方法吗?
1 回答
我只是遇到了类似的问题,我的列表中只有20个元素的搜索速度非常慢 . 也许你的问题很相似 . 可悲的是,你没有发布任何代码 . 我有这样的事情:
我无法理解为什么会这么慢 . 我发现了一种具有更多开销的不同方法,由于某种原因,它更快,响应更快,并且对用户来说整体感觉更好 . 我的
ListView
总是ObservableCollection
为ItemsSource
. 当我过滤我计算这个ObservableCollection
(额外的项目和删除的项目)的差异,然后删除或相应添加 . 这样可以避免替换ItemsSource
上看起来太苛刻的ItemsSource
属性 .笔记:
删除
listView.BeginRefresh()
和EndRefresh()
似乎没有影响性能,但在这里调用它们似乎是正确的 .我们需要在
itemsToAdd
和itemsToRemove
上调用ToList()
,即使我们只需要IEnumerables
!这是因为Except
是一个惰性操作,否则只会在for循环中进行评估 . 但是在for循环期间,其中一个参数除了由于修改IEnumerable
而导致IllegalArgumentException
的变化 .如果有人知道一个好的可过滤的可观察集合,那可能是一个更好的解决方案 .