根据搜索栏中给出的字符串搜索ObservableCollection列表

时间:2018-12-07 17:20:26

标签: listview xamarin mvvm xamarin.forms xamarin.ios

我正在研究 Xamarin 表单项目。

下面是我的模板.xaml文件:

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

我将列表视图填充为:

public ObservableCollection<Grouping<string, Ticket>> TicketList
    {
        get { return _ticketList; }
        set { _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]);
            }
        }

}

在搜索过程中,它会转到else部分,在这里将列表填充到TicketList花费的时间太长。我觉得这不是首先清除列表并一次分配每个列表项的正确设计。

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

1 个答案:

答案 0 :(得分:1)

我会在ItemsSource上绑定ListView属性,而不是分配它,还要确保您在ListView中设置了RecycleElement,这样您的物品才能回收的(如果不放置,则所有项目将直接加载到ListView中;设置此项将启用项目的虚拟化,以便回收单元,因此对于大型馆藏,其性能得到了显着提高)

<ListView
    ...
    ItemsSource="{Binding TicketList}`>
    ...
    <x:Arguments>
        <ListViewCachingStrategy>RecycleElement</ListViewCachingStrategy>
    </x:Arguments>
</ListView>

还直接对sorted变量进行foreach:

foreach(var item in sorted)
{
    TicketList.Add(item);
}

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

我认为这将加快流程。

HIH