ItemAppearingイベントを使用してListViewをスクロールダウンすると、Xamarin.Formsのレコードがスキップされます

ナンジマンゲ

私が持っているListViewXamarinページで。ItemAppearingイベントを使用して下にスクロールします。ListViewCellの高さが大きいため、1つの画面が最初にカバーされ、2番目のビューセルの80%がカバーされます。

下にスクロールするためにさらにデータをロードする手順:

  1. 最初にページが読み込まれると、APIが呼び出され、EmployerResultListに10個のレコードが取得されます。これは、データバインディングを使用してListViewに追加されます。
  2. ItemAppearingイベントを。このイベントには条件があります。最後のセルが表示され始めると、APIが呼び出され、ViewModelのListオブジェクトに10レコードが再度追加されます。
  3. したがって、このようにしてAPIを呼び出し、最後のセルが表示され始めるたびに10レコードを追加します。

これでポイントはすべてのロードにあり、最後のレコードをスキップして、次の10レコードの最初のレコードを表示します。ただし、ユーザーがすばやくスクロールダウンすると、2〜3レコードがスキップされることがあります。

つまり、初めて10レコードある場合。現在、9番目のレコードにあり、10までスクロールダウンしています。10番目のレコードが表示され始め、API呼び出しが発生します。この通話が完了すると、画面の上部に11番目のレコードが表示されます。ここでは、10番目のレコードはスキップされます。このようにして、ユーザーには10番目ではなく11番目のレコードが表示されます。ここで、ユーザーは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;
}
ナンジマンゲ

私がしたことは、最後に空白のセルを追加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;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ