gpt4 book ai didi

xamarin.forms - 以每个结果十个项目的增量加载数据 Xamarin Forms

转载 作者:行者123 更新时间:2023-12-01 12:24:16 29 4
gpt4 key购买 nike

我正在尝试构建一个请求,每次请求都会从服务器加载 10 个项目。例如,当用户单击一个按钮,将他们重定向到下一页时,我希望首先显示前 10 个项目,同时在后台发出对其他项目的请求。我应该怎么做呢?我知道它是如何工作的,在服务器端通过设置返回的最大数量并从每个请求的起始位置开始,但这是正确的看待方式吗?

最佳答案

是的,这听起来是个很好的处理方式。这通常称为数据的“分页”。

让您的 API 处理您要接收的数据“页面”的偏移量以及为该页面返回的最大项目数(页面大小)。下面是一个示例,说明如何为 Forms 实现此功能。

您的 ViewModel 要实现的契约(Contract):

public interface ISupportIncrementalLoading
{
int PageSize { get; set; }

bool HasMoreItems { get; set; }

bool IsLoading { get; }

Task LoadMoreItemsAsync();
}

ViewModel 中的示例实现:

#region ISupportIncrementalLoading Implementation

public int PageSize { get; set; } = 10;

public bool HasMoreItems { get; set; }

public async Task LoadMoreItemsAsync()
{
await LoadMoreItemsCommand.ExecuteAsyncTask();
}

//...

#endregion

示例 LoadMoreItems 命令:

LoadMoreItemsCommand = new Command(async () =>
{
int fetchOffset = Requests.Count;
int fetchMax = PageSize;

// "Pagination" of your API request starting at the offset
// and getting a maximum of the `fetchMax` or "page size"
Results = await GetRequestsAsync(fetchOffset, fetchMax);
});

要在像 ListView 这样的控件中自动支持这一点,您可以自定义渲染器或“效果”来执行此操作。这是一个修剪过的例子:

// Custom ListViewRenderer, iOS example
public class IncrementalListViewRenderer : ListViewRenderer
{
public IncrementalListViewRenderer()
{
}

protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
{
base.OnElementChanged(e);

if (Control != null)
{
// Need to customize the source but not lose existing functionality so
// we need a copy of it to use
UITableViewSource defaultSource = Control.Source;
Control.Source = new IncrementalDataSource(Element as IncrementalListView, defaultSource);
}
}

class IncrementalDataSource : UITableViewSource
{
readonly UITableViewSource existingSource;
readonly IncrementalListView listView;
readonly ISupportIncrementalLoading incrementalLoading;

int lastPosition;
int preloadMargin = 5;

public IncrementalDataSource(IncrementalListView listView, UITableViewSource existingSource)
{
this.listView = listView;
this.existingSource = existingSource;

incrementalLoading = listView.BindingContext as ISupportIncrementalLoading;

lastPosition = 0;

LoadMoreItems();
}

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
int position = indexPath.Row;
var itemsSource = listView.ItemsSource as IList;

if (itemsSource != null)
{
int preloadIndex = Math.Max(itemsSource.Count - preloadMargin, 0);

if ((position > lastPosition || (position == itemsSource.Count - 1)) && (position >= preloadIndex))
{
lastPosition = position;

if(!incrementalLoading.IsLoading && incrementalLoading.HasMoreItems)
LoadMoreItems();
}
}

var cell = existingSource.GetCell(tableView, indexPath);
cell.SelectionStyle = UITableViewCellSelectionStyle.None;

return cell;
}

public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
existingSource.RowSelected(tableView, indexPath);
}

public override nint RowsInSection(UITableView tableview, nint section)
{
return existingSource.RowsInSection(tableview, section);
}

void LoadMoreItems()
{
// Note the use of Nito.AsyncEx lib
INotifyTaskCompletion taskCompletion = NotifyTaskCompletion.Create(LoadMoreItemsAsync());
}

public async Task LoadMoreItemsAsync()
{
await incrementalLoading.LoadMoreItemsAsync();
}
}
}

这利用了 this 中的技术插件。

关于xamarin.forms - 以每个结果十个项目的增量加载数据 Xamarin Forms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41577628/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com