我想帮助加快过滤一长列表项并在ListView上查看它们的过程。
我的应用程序有一个搜索栏,一个ListView和一个很长的字符串列表供您选择。
当用户输入搜索词时,ListView会随每个键击更新并过滤掉不相关的项目。
排序本身需要几毫秒,但之后使用新过滤器事件更新ListView需要很长时间(如果只输入一个字符作为搜索条件,则需要20秒)
我相信每次过滤后的列表更新时,都会花费大量时间来充气大量的ViewCell。
你们中的任何人都知道如何加快这个过程吗?我认为它的工作方式是拥有非常有限数量的ViewCells(如10或20),然后让它们更新,只显示筛选列表的选择。滚动将重复使用顶部/底部,更新内容并将其放回到底部/顶部 - 但我无法解决如何执行此操作。
也许这是错误的做法,你知道更好的方法吗?
答案 0 :(得分:0)
我遇到了类似的问题,我只有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()
似乎不会影响效果,但在此处调用它们似乎是正确的。ToList()
和itemsToAdd
上致电itemsToRemove
,即使我们只需要IEnumerables
!这是因为Except
是一个惰性操作,否则只会在for循环期间进行评估。但是,在for循环期间,其中一个参数除了由于修改IllegalArgumentException
而导致IEnumerable
的更改导致{。}}。