私が持っているListView
Xamarinページで。ItemAppearing
イベントを使用して下にスクロールします。ListViewCellの高さが大きいため、1つの画面が最初にカバーされ、2番目のビューセルの80%がカバーされます。
下にスクロールするためにさらにデータをロードする手順:
ItemAppearing
イベントを。このイベントには条件があります。最後のセルが表示され始めると、APIが呼び出され、ViewModelのListオブジェクトに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]
コメントを追加