У меня есть ObservableCollection
, связанный с ListView
. Этот список в основном представляет собой набор элементов. Если вы нажмете один, его состояние изменится. Он добавлен в избранное и показан в списке избранных (также ListView
) или удален из избранного.Какие шаги можно предпринять для оптимизации ListView
Это основная функция моего приложения, поэтому будет много добавления-удаления. Оба списка медленны, багги и мерцают при обновлении.
Как я могу сделать это быстрее/плавно?
Я попытался запустить все добавления/удаления вызовов рабочего потока. Я попытался использовать функцию Task
и async
(что сделало ее хуже на самом деле). Есть ли «правильная» реализация этого сценария? (ListView
ui thread и рабочая нить, поддерживающая его актуальность) Есть ли статья, которая могла бы научить меня хорошей практике?
Реализация: Примечание: Грузовик - это еще один класс, который хранит данные. Из класса данных:
List<Truck> trucks = new List<Truck>();
public void addToFavorites(Truck truck)
{
foreach(Truck t in trucks)
{
if(t == truck)
{
t.setFavorite(true);
}
}
}
public void removeFromFavorites(Truck truck)
{
foreach (Truck t in trucks)
{
if (t == truck)
{
t.setFavorite(true);
}
}
}
public List<Truck> getTrucks()
{
return trucks;
}
public List<Truck> getFavoriteTrucks()
{
List<Truck> temp = new List<Truck>();
foreach(Truck t in trucks)
{
if (t.isFavorite())
{
temp.Add(t);
}
}
return temp;
}
На странице, которая показывает все Грузовики:
public partial class AllPage : ContentPage
{
public AllPage(csharp.Data data)
{
//init
InitializeComponent();
this.data = data;
//build list
refreshAsync();
ListView list = new ListView()
{
ItemTemplate = new DataTemplate(typeof(csharp.PlateCell)),
ItemsSource = trucks,
IsPullToRefreshEnabled = true,
};
//on select
list.ItemSelected += (sender, e) => {
if (e.SelectedItem == null) return; //row deselected, dont do anything
var selection = e.SelectedItem as csharp.Truck;
if (selection.isFavorite())
{
data.removeFromFavorites(selection);
selection.setFavorite(false);
}
else {
data.addToFavorites(selection);
selection.setFavorite(true);
}
((ListView)sender).SelectedItem = null; // de-select the row
refreshAsync();
};
list.RefreshCommand = new Command(() =>
{
//trucks = data.getFavoriteTrucks();
refreshAsync();
list.IsRefreshing = false;
});
//add the list to the page
root.Children.Add(list);
}//end constructor
csharp.Data data;
ObservableCollection<csharp.Truck> trucks = new ObservableCollection<csharp.Truck>();
private async Task refreshAsync()
{
await Task.Run(() => refreshThread());
}
private void refreshThread()
{
List<csharp.Truck> all = data.getTrucks();
trucks.Clear();
foreach (csharp.Truck t in all)
{
trucks.Add(t);
}
}
}
Не могли бы вы добавить код, как вы реализовали _Its добавлен в избранное, и отображается в списке избранного (также ListView) или удаляется из избранного. –
Добавлен класс данных, в котором все хранится и реализация ListView который показывает эти данные. Обратите внимание, что класс Data в будущем будет получать информацию с сервера. Список в настоящее время всегда одинаковый для Data и allPage, когда дело доходит до размера и объектов, которые он содержит, это не всегда так. – wasted
У этого есть все, что нужно - https://developer.xamarin.com/guides/xamarin-forms/user-interface/listview/performance/ –