我尝试实现ISupportIncrementalLoading接口,当滚动条到达末尾时,在其他URL中加载更多项目。
示例(预期风景):我的第一个请求给我一个项目列表和一个NextURL。 下一个URL需要加载更多项目,直到页面已满。当我按下滚动条时,加载更多项目。
问题:这项工作仅适用于低分辨率的屏幕,当我在第一次请求后测试1680x1050的第二个屏幕时没有加载更多项目(此请求给我一个NextUrl)。
我之前提到的部分代码不同页面:
private string NextUrl { get; set; }
private int currentPage;
private object MyData{ get; set; }
public bool HasMoreItems
{
get {
return hasMoreItems;
}
}
public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count = 0)
{
var dispatcher = Window.Current.Dispatcher;
return Task.Run<LoadMoreItemsResult>(
async () =>
{
var result = await this.Source.GetPage(this.MyData, this.NextUrl , this.CurrentPage++);
if (string.IsNullOrEmpty(result.NextUrl ))
hasMoreItems = false;
else
hasMoreItems = true;
if (result != null || result.Items.Count() == 0 )
{
this.NextUrl = result.NextUrl ;
resultCount = (uint)result.Items.Count();
await dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
() =>
{
foreach (ItemType item in result.Items)
this.Add(item);
});
return new LoadMoreItemsResult() { Count = resultCount };
}
}).AsAsyncOperation<LoadMoreItemsResult>();
}
有人帮帮我吗?
由于
答案 0 :(得分:0)
出现问题是因为第一个请求中的项目数量不会填满整个屏幕,因此在第一个请求完成之前,LoadModeItemsAsync()
会非常快地调用两次(或更多)。
要处理这个问题,我会添加一个boolean
标记,在开始获取数据时设置为true,在完成任务时设置为false。在加载函数开始时,您只需在开始下载更多数据之前检查此值是否设置为false。
private string NextUrl { get; set; }
private int currentPage;
private object MyData { get; set; }
private bool _isLoading = false;
public bool isLoading
{
get { return _isLoading; }
set { _isLoading = value; }
}
public bool HasMoreItems
{
get
{
return hasMoreItems;
}
}
private async Task<LoadMoreItemsResult> LoadDataAsync()
{
if (!isLoading)
isLoading = true;
else
return new LoadMoreItemsResult { Count = (uint)this.Count };
var result = await this.Source.GetPage(this.MyData, this.NextUrl, this.CurrentPage++);
if (string.IsNullOrEmpty(result.NextUrl))
hasMoreItems = false;
else
hasMoreItems = true;
if (result != null || result.Items.Count() == 0)
{
this.NextUrl = result.NextUrl;
resultCount = (uint)result.Items.Count();
await dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
() =>
{
foreach (ItemType item in result.Items)
this.Add(item);
});
}
isLoading = false;
return new LoadMoreItemsResult { Count = (uint)this.resultCount }; ;
}
public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count = 0)
{
return LoadDataAsync().AsAsyncOperation<LoadMoreItemsResult>();
}