#c# #xaml #xamarin.forms
Вопрос:
Мой список MyWordsList содержит 10000 элементов. Я пытаюсь добавлять следующие 100 элементов в collectionview каждый раз, когда я опускаюсь.
Вот мой код c#:
public MainPage()
{
Var MyWordsList = await mywordsdatabase.GetWords();
WordSList.ItemsSource =MyWordsList.Take(100); // start with 100 elemets in the list;
WordSList.RemainingItemsThreshold = 5;
WordSList.RemainingItemsThresholdReached = WordSList_RemainingItemsThresholdReached;
}
private void WordSList_RemainingItemsThresholdReached(object sender, EventArgs e)
{
// Load More Data Here when scroll down
// Take the next 100 elements
// if all the elements are added do not add
}
Вот код Xaml :
<CollectionView x:Name="WordSList" ItemsLayout="Vertical" >
<CollectionView.ItemTemplate >
<DataTemplate>
<StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
<Label TextColor="#7D7D7D" Text="{Binding Word1}" FontSize="15" />
<Label TextColor="Black" Text=" - " FontSize="15" />
<Label TextColor="#0F9D58" Text="{Binding Word2}" FontSize="15" />
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
Спасибо за вашу помощь
Ответ №1:
когда вы делаете это, вы создаете локальную переменную, которая существует только в содержащем ее методе.
Var MyWordsList = await mywordsdatabase.GetWords();
поскольку вы хотите использовать эти данные позже, вам нужно сделать их переменной класса. Вам также нужна переменная для хранения источника данных в
List<MyClass> MyWordsList;
ObservableCollection<MyClass> datasource;
int ndx = 100;
public MainPage()
{
MyWordsList = await mywordsdatabase.GetWords();
WordSList.ItemsSource = datasource = new ObservableCollection<MyClass>(MyWordsList.Take(ndx));
...
}
затем
private void WordSList_RemainingItemsThresholdReached(object sender, EventArgs e)
{
datasource.AddRange(MyWordsList.Skip(ndx).Take(100));
ndx = 100;
}
Комментарии:
1. Я пытаюсь это сделать
2. У меня ошибка при добавлении элемента в источник данных в этой строке ( источник данных. Добавить(MyWordsList.Пропустить(ndx). Возьмите(100));): «ObservableCollection<MyWords>» не содержит определения для «AddRange», и не может быть найден доступный метод расширения «AddRange», принимающий первый аргумент типа «ObservableCollection<MyWords><MyWords>» (у вас отсутствует директива using или ссылка на сборку?)
3. Вместо этого используйте ObservableRangeCollection — docs.microsoft.com/en-us/dotnet/api/…
4. У меня есть код серьезности ошибки Описание Состояния подавления строки файла проекта Ошибка CS0246 Тип или имя пространства имен «ObservableRangeCollection<>» не удалось найти (у вас отсутствует директива using или ссылка на сборку?)
5. Я не могу загрузить библиотеку. Даже при выполнении : Система. Коллекции. Объектная модель. Коллекция<MyClass>
Ответ №2:
Не уверен, каковы ваши намерения здесь в отношении 10000 предметов. если вы в порядке, чтобы загрузить их все сразу
MyWordsList = await mywordsdatabase.GetWords();
Тогда вам не понадобится остальная часть кода, так как CollectView поддерживает виртуализацию с помощью элемента управления подчеркивание. Вы можете загрузить всю коллекцию, и она будет динамически выделять/освобождать элемент пользовательского интерфейса элемента по мере необходимости эффективно.
Если загрузка 10000 элементов из базы данных занимает слишком много времени, именно здесь вам нужно возиться с _RemainingItemsThreshold и т. Д. Сначала необходимо изменить интерфейс базы данных, чтобы иметь возможность возвращать только сегмент элементов, например mywordsdatabase.GetWords(startIndex, count);
, тогда, вероятно, будет хорошей идеей сослаться на некоторые реализации бесконечной прокрутки:
https://doumer.me/infinite-scroll-with-the-xamarin-forms-collection-view/
Комментарии:
1. Его можно поддерживать до 500000 предметов ?
2. никакой вашей базы данных mywordsdatabase. GetWords(); отключится. Вы реализуете IEnumerable<> или IQueryable<><> в методе GetWords и планируете использовать отложенное выполнение? если это так, вы хотите вернуть объект напрямую, не ожидая, и только ожидая получения элементов. например, дождитесь списка MyWordsList .пропустите(100).возьмите(100). ToListAsync()
3. Это я требую