Xamarin表单SearchBar + ListView缓慢更新

时间:2018-05-02 19:54:37

标签: forms listview xamarin optimization searchbar

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

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

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

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

我相信每次过滤后的列表更新时,都会花费大量时间来充气大量的ViewCell。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

我无法理解为什么会这么慢。我发现了一种具有更多开销的不同方法,由于某种原因,它更快,响应更快,并且对用户来说整体感觉更好。我的ListView总是ObservableCollectionItemsSource。当我过滤时,我计算与此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的更改导致{。}}。
  • 如果有人知道一个好的可过滤的可观察集合,那可能是一个更好的解决方案。