我在互联网上阅读过示例,有些非常难学。
我想了解如何理解 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/