поиск в списке ObservableCollection на основе строки, указанной в строке поиска - PullRequest
0 голосов
/ 07 декабря 2018

Я работаю над 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]);
            }
        }

}

Во время поиска он переходит к другой части, и здесь уходит слишком много времени на заполнение списка в TicketList.Мне кажется, что это неправильный дизайн, чтобы сначала очистить список и назначать каждый элемент списка по одному за раз.

какое-нибудь лучшее решение для поиска?

1 Ответ

0 голосов
/ 07 декабря 2018

Я бы связал свойство ItemsSource на ListView вместо его назначения, а также удостоверился, что вы устанавливаете RecycleElement в ListView, чтобы ваши предметы были переработаны (если выне устанавливайте это, все элементы будут загружены в ListView напрямую; установка этого параметра позволит виртуализировать элементы, чтобы клетки были переработаны и, следовательно, производительность для больших коллекций значительно улучшилась)

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

А также непосредственно выполняйте foreach вашей sorted переменной:

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

Если вы сделаете .ToList(), он сгенерирует и выделит вам новый List объект, выполнив непосредственно foreachвозьму IEnumerable и повторим его по ссылке.

Думаю, это ускорит процесс.

HIH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...