listview - 如何以简单的方式为UWP实现延迟加载ListView?

标签 listview win-universal-app loading lazy-evaluation

我在互联网上阅读过示例,有些非常难学。

我想了解如何理解 ListView 何时向下滚动以及是否仍有更多数据可用,如何在屏幕上显示 ProgressRing 的同时从互联网获取数据。

对于我的示例,我使用 JSON 从 PHP 服务器获取数据,每个请求都会从数据库获取 10 个项目。

如果您能提供一个易于理解的示例,我们将不胜感激。

最佳答案

public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            myListView.ItemsSource = new ItemsDataSource();
        }
    }
    public interface IIncrementalSource<T>
    {
        Task<IEnumerable<T>> GetPagedItems(int pageIndex, int pageSize,string url);
    }

    public class IncrementalLoadingCollection<T, I> : ObservableCollection<I>,
         ISupportIncrementalLoading
         where T : IIncrementalSource<I>, new()
    {
        private T source;
        private int itemsPerPage;
        private bool hasMoreItems;
        private int currentPage=0;
        string url;
        public IncrementalLoadingCollection(string url,int itemsPerPage = 10)
        {
            this.source = new T();
            this.itemsPerPage = itemsPerPage;
            this.hasMoreItems = true;
            this.url = url;
        }

        public bool HasMoreItems
        {
            get { return hasMoreItems; }
        }

        public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
        {
            var dispatcher = Window.Current.Dispatcher;

            return Task.Run<LoadMoreItemsResult>(
                async () =>
                {
                    uint resultCount = 0;
                    var result = await source.GetPagedItems(currentPage++, itemsPerPage,url);

                    if (result == null || result.Count() == 0)
                    {
                        hasMoreItems = false;
                    }
                    else
                    {
                        resultCount = (uint)result.Count();

                        await dispatcher.RunAsync(
                            CoreDispatcherPriority.Normal,
                            () =>
                            {
                                foreach (I item in result)
                                    this.Add(item);
                            });
                    }

                    return new LoadMoreItemsResult() { Count = resultCount };

                }).AsAsyncOperation<LoadMoreItemsResult>();
        }
    }
    public class StructList
    {
        public string Name { get; set; }
    }
    public class ItemsDataSource : IIncrementalSource<StructList>
    {
        private List<StructList> persons;

        public ItemsDataSource()
        {
            persons = new List<StructList>();

            //for (int i = 0; i < 1024; i++)
           // {
            //    var p = new StructList { Name = "Person " + i };
           //     persons.Add(p);
           // }
        }

        public async Task<IEnumerable<StructList>> GetPagedItems(int pageIndex, int pageSize,string url)
        {

            if (persons.Count > 10000) //you wriiten   if (lastItem == 10000),assuming max items 10000
                return null;
            //If you want only 10 items and url returns more than 10 at a time     
            var result = (from p in persons
                          select p).Skip(pageIndex * pageSize).Take(pageSize);
            if (result == null)
            {
                List<KeyValuePair<string, string>> postData = new List<KeyValuePair<string, string>>();
                postData.Add(new KeyValuePair<string, string>("part", pageIndex.ToString()));
                string JSonData = await WebService.get_post_respone(url, postData);
                var items = JsonConvert.DeserializeObject<List<StructList>>(JSonData);
                foreach (var item in items)
                    persons.Add(item);

                return await Task.Run<IEnumerable<StructList>>(() =>
                {
                    result = (from p in persons
                              select p).Skip(pageIndex * pageSize).Take(pageSize);

                    return result;
                });
            }
            else
                return result;
        }
    }

了解更多信息Refer this Link

关于listview - 如何以简单的方式为UWP实现延迟加载ListView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37088663/

相关文章:

javascript - 如何将此 RSS 提要放入 jQuery ListView 中?

WPF数据虚拟化ListView

c# - UWP 状态触发器绑定(bind)

angular - 显示每个 http 请求的加载栏 angular2

java - 为 ListView 项目设置背景?

c# - 在通用应用程序中使用 POST 方法发送登录数据

xaml - ListView MVVM内TextBox上的UWP InvokeCommandAction

javascript - 我应该如何解决 Chrome 的 XMLHttpRequest 侵入性 'loading' 行为?

css - 是否可以从 css 调用 servlet?

android - ListView 在滚动时显示错误位置的图像