Прокрутка в ListView с использованием события ItemAppearing пропускает записи в Xamarin.Forms - PullRequest
0 голосов
/ 22 мая 2018

У меня есть ListView на странице Xamarin.Я использую событие ItemAppearing для прокрутки вниз.Высота ListViewCell велика, поэтому 1 экран покрывает первую и 80% часть второй видовой ячейки.

Шаги для загрузки дополнительных данных для прокрутки вниз:

  1. Первоначально при загрузке страницы вызывается API иполучить 10 записей в списке EmployerResult.Это будет добавлено в ListView с использованием привязки данных.
  2. Наличие события ItemAppearing.В этом событии есть условие.Когда последняя ячейка начинает появляться, она вызывает API и снова добавляет 10 записей в объект List в ViewModel.
  3. Таким образом, таким образом он будет вызывать 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;
}

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

Что я сделал, так это добавил дополнительную пустую ячейку в конце на LoadMoreEmployerResult и запросил дополнительную загрузку при появлении на ней.При загрузке больше, я удаляю эту пустую ячейку.Это единственный способ решить мою проблему.

private async void LoadMoreEmployerResult()
{
    IsBusy = true;
    if(EmployerResults.Last().Name == "")
        EmployerResults.RemoveAt(EmployerResults.Count - 1);
    List<EmployerProfile> currentPageList= await _employerApiClient.GetMoreData(pagenumber);
    if(currentPageList.Count > 0)
    {
        EmployerResults.AddRange(currentPageList);
        EmployerResults.Add(new EmployerProfile());
    }

    IsBusy = false;
}
0 голосов
/ 22 мая 2018

Насколько я понимаю, вы пытаетесь выполнить отложенную загрузку.

- Во-первых, вам следует установить стратегию утилизации следующим образом: CachingStrategy = "RecycleElement", если вы хотите приемлемые характеристики, как описано здесь https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/performance,, а затем повторно протестируйте поведение события ItemAppearing.

-Тогда это может быть хорошей идеей для использования или анализа существующего компонента, который обрабатывает ваши потребности.Например: http://15mgm15.ghost.io/2017/11/28/implement-an-infinite-scrolling-listview-with-xamarin-forms/

...