我正在研究 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花费的时间太长。我觉得这不是首先清除列表并一次分配每个列表项的正确设计。
有更好的搜索解决方案吗?
答案 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