У меня есть ListView
на странице Xamarin. Я использую событие ItemAppearing
для прокрутки вниз. Высота ListViewCell большая, поэтому 1 экран покрывает первую и 80% часть второй ячейки просмотра.
Шаги для загрузки дополнительных данных для прокрутки вниз:
- Первоначально при загрузке страницы она вызывает API и получает 10 записей в списке EmployerResult. Это будет добавлено в ListView с помощью привязки данных.
- Событие
ItemAppearing
. В этом событии есть условие. Когда начнет появляться последняя ячейка, она вызовет API и снова добавит 10 записей в объект List ViewModel. - Таким образом, он будет вызывать API и добавлять 10 записей каждый раз, когда начнет появляться последняя ячейка.
Теперь точка при каждой загрузке, она пропускает последнюю запись и показывает первую запись из следующих 10 записей. Однако иногда он пропускает 2-3 записи, если пользователь быстро прокручивает страницу вниз.
то есть, если у меня есть 10 записей в первый раз. Теперь я нахожусь на 9-й записи и прокручиваю вниз до 10. Начинает появляться 10-я запись, и срабатывает вызов API. После завершения этого вызова на экране появится 11-я запись в верхней части экрана. Здесь пропущена 10-я запись. Таким образом, пользователь увидит 11-ю запись, а не 10-ю. Здесь пользователю нужно снова прокрутить вверх, чтобы увидеть 10-ю запись.
Иногда он пропускает 2-3 записи, если пользователь быстро прокручивает страницу вниз.
Кто-нибудь может предложить мне?
Код
XAML
<ListView Grid.Row="0" x:Name="EmployerResultsListView"
ItemsSource="{Binding EmployerResults}"
HasUnevenRows = "true"
SeparatorVisibility="None"
IsPullToRefreshEnabled="true"
RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing, Mode=OneWay}"
ItemAppearing="Handle_ItemAppearing"
ItemTapped="OnEmployerResultsListViewItemTapped">
<ListView.ItemTemplate>
<DataTemplate>
<local:EmployerResultViewCell />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
XAML.CS
private void Handle_ItemAppearing(object sender, ItemVisibilityEventArgs e)
{
var itemTypeObject = e.Item as EmployerProfile;
if (_viewModel.EmployerResults.Last() == itemTypeObject && _viewModel.EmployerResults.Count() != 1)
{
if (_viewModel.LoadMoreCommand.CanExecute(null))
{
_viewModel.LoadMoreCommand.Execute(null);
}
}
}
ViewModel
public EmployerResultsViewModel()
{
LoadMoreCommand = new RelayCommand(LoadMoreEmployerResult, () => !IsBusy);
EmployerResults = new ObservableRangeCollection<EmployerProfile>();
}
public ObservableRangeCollection<EmployerProfile> EmployerResults { get; set; }
private async void LoadMoreEmployerResult()
{
IsBusy = true;
EmployerResults.AddRange((await _employerApiClient.GetMoreData(pagenumber)));
IsBusy = false;
}