实现ISupportIncrementalLoading接口 - Windows 10 UWP

时间:2016-01-22 10:28:55

标签: c# loading windows-10 screen-resolution windows-10-mobile

我尝试实现ISupportIncrementalLoading接口,当滚动条到达末尾时,在其他URL中加载更多项目。

示例(预期风景):我的第一个请求给我一个项目列表和一个NextURL。 下一个URL需要加载更多项目,直到页面已满。当我按下滚动条时,加载更多项目。

问题:这项工作仅适用于低分辨率的屏幕,当我在第一次请求后测试1680x1050的第二个屏幕时没有加载更多项目(此请求给我一个NextUrl)。

我尝试实现这个:https://marcominerva.wordpress.com/2013/05/22/implementing-the-isupportincrementalloading-interface-in-a-window-store-app/

我之前提到的部分代码不同页面:

    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>();
    }

有人帮帮我吗?

由于

1 个答案:

答案 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>();
}