Добавьте следующие 20 элементов в CollectionView при каждой прокрутке в режиме просмотра коллекции

#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. Это я требую