Listview 基于搜索栏中给定的字符串搜索ObservableCollection列表

Listview 基于搜索栏中给定的字符串搜索ObservableCollection列表,listview,xamarin,mvvm,xamarin.forms,xamarin.ios,Listview,Xamarin,Mvvm,Xamarin.forms,Xamarin.ios,我正在从事Xamarin的表单项目 下面是我的template.xaml文件: <StackLayout> <SearchBar>.....</SearchBar> <ListView>.....</ListView> </StackLayout> ..... ..... 我将listview填充为: public ObservableCollection<Grouping<string, Ticket&g

我正在从事Xamarin的表单项目

下面是我的template.xaml文件:

<StackLayout>
<SearchBar>.....</SearchBar>
<ListView>.....</ListView>
</StackLayout>

.....
.....
我将listview填充为:

public ObservableCollection<Grouping<string, Ticket>> TicketList
    {
        get { return _ticketList; }
        set { _ticketList = value; OnPropertyChanged(); }
    }

listview.ItemSource = TicketList;
公共可观测收集票证列表
{
获取{return\u ticketList;}
设置{u ticketList=value;OnPropertyChanged();}
}
listview.ItemSource=TicketList;
以下是搜索代码:

public void FilterList(string searchText)
{
TicketListNew = // getting list from local database

 // searching each field of list with the text entered
  GroupCollections(TicketListNew.Where(Tl => Tl.CustomerName.ToLower().Contains(searchText.ToLower())
}

private void GroupCollections(List<Ticket> ticketListNew){
var sorted = from ticket in ticketListNew
                     orderby ticket.DelPUDate
                     group ticket by GetTicketDate(ticket.DelPUDate) into ticketListGroup
                     select new Grouping<string, Ticket>(ticketListGroup.Key, ticketListGroup);
        if (TicketList == null) TicketList = new ObservableCollection<Grouping<string, Ticket>>(sorted);
        else
        {
            TicketList.Clear();
            var temp = sorted.ToList();
            for (var i = 0; i < temp.Count; i++)
            {
                TicketList.Add(temp[i]);
            }
        }

}
public void FilterList(字符串搜索文本)
{
TicketListNew=//从本地数据库获取列表
//使用输入的文本搜索列表的每个字段
GroupCollections(TicketListNew.Where(Tl=>Tl.CustomerName.ToLower().Contains)(searchText.ToLower())
}
私有void组集合(列表ticketListNew){
var sorted=来自ticketListNew中的票证
德尔普塔特订购单
按GetTicketDate(ticket.DelPUDate)将票证分组到票证列表组
选择新分组(ticketListGroup.Key,ticketListGroup);
如果(TicketList==null)TicketList=newobserveCollection(已排序);
其他的
{
TicketList.Clear();
var temp=sorted.ToList();
对于(变量i=0;i
在搜索过程中,它会转到else部分,而在这里,将列表填充到TicketList所需的时间太长。我觉得首先清除列表并一次分配每个列表项不是正确的设计


有更好的搜索解决方案吗?

我将绑定
列表视图
上的
ItemsSource
属性,而不是分配它,并确保您在
列表视图
中进行设置,以便您的项目得到回收(如果不放置此选项,则所有项目都将直接加载到
列表视图中;设置此选项将启用项目的虚拟化,以便回收单元格,从而大大提高大型集合的性能)

如果执行
.ToList()
操作,它将生成并分配一个新的
列表
对象,通过直接执行foreach操作,将获取
IEnumerable
并通过引用对其进行迭代

我认为这将加快进程


HIH

感谢您的回复。我没有使用customListView,因此无法使用上述缓存策略,而是已经在设置CachingStrategy=“RecycleElement”到我的列表视图。现在我正在用xaml绑定itemsource并对foreach进行排序。但是我仍然看到一些延迟。我必须查看项目的
DataTemplate
,以帮助您解决问题。当然,您的项目太重,无法渲染,或者您使用太多布局嵌套肯定会降低性能。顺便说一句,延迟是即使插入每个项目,还是直到加载第一个/所有项目?延迟是因为插入每个项目(for循环),基于我的调试另外,我的数据模板很大,每个列表项有8行,并按日期分组。我刚刚添加了一些日志,以查看造成此延迟的原因。我可以清楚地看到for-loop花费了很多时间。您能否指出列表中有多少项?无论如何,问题确实在于清除和重建列表。它是一个可观察的集合,附加到listview,这意味着每次您清除列表时,它都必须从页面中删除所有可视元素,然后再次添加它们(即使您回收它们),这使得清除和重建列表的操作成本非常高。可能最好检查您必须删除哪些项,并仅从列表中删除那些项。其次,每次调用FilterList时执行数据库调用也是一个坏主意,只需存储内存副本并对其执行逻辑即可
<ListView
    ...
    ItemsSource="{Binding TicketList}`>
    ...
    <x:Arguments>
        <ListViewCachingStrategy>RecycleElement</ListViewCachingStrategy>
    </x:Arguments>
</ListView>
foreach(var item in sorted)
{
    TicketList.Add(item);
}