У меня есть 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;
}