У меня есть ListView и SearchBar, я использую событие TextChanged SearchBar для фильтрации результатов ListView. Однако каждый раз, когда я ввожу значение в SearchBar, пользовательский интерфейс зависает.
Вот видео с реальным поведением, которое я вижу:
https://drive.google.com/open?id=1SM94AbD_00WDQT9yzpJN8ta_NDj4Lb13
1.- Я не вызываю веб-службу в событии TextChanged, а фильтрую предварительно загруженный список в памяти. Функция возвращает отфильтрованный список всего за миллисекунды.
2.- ListView использует GroupHeaderTemplate.
3.- В списке около 150 строк.
Как я могу предотвратить зависание пользовательского интерфейса?
Вот код:
// TextChanged Event
void Handle_TextChanged(object sender, Xamarin.Forms.TextChangedEventArgs e)
{
Xamarin.Forms.Device.BeginInvokeOnMainThread(() => {
this.lsProducts.BeginRefresh();
this.lsProducts.ItemsSource = App.Locator.Products.FilterProducts(e.NewTextValue);
this.lsProducts.EndRefresh();
});
}
// FilterProducts VM function
public List<products_list> FilterProducts(string filter)
{
List<products_list> theCollection = new List<products_list>();
if ( ! string.IsNullOrEmpty( filter ) )
{
if (_products_list != null)
{
List<products_list> entities = (
from e in _products_list
where e.Any( x => x.search_field_text.Contains( filter.ToLowerInvariant() ) )
select e
).ToList<products_list>();
// if there's entities
if (entities != null && entities.Any())
{
entities.ForEach(x => theCollection.Add(
new products_list(
x.products
.Where(y => y.search_field_text.Contains( filter.ToLowerInvariant() ) )
.ToList()
)
{
header = x.header
}
)
);
}
}
}
else
{
theCollection = _products_list;
}
return theCollection;
}
Я могу поделиться более подробной информацией, дайте мне знать.