基于GridView LoadMoreAsync 设计的横向双向瀑布流 组件 源码分享
原理:
实现了ISupportIncrementalLoading 接口
完成了增量加载,
针对于本地对象无法释放的情况 增加了 相关的Func
同时 通过VisualTree 拿到了GridView中 HorizontalBar 来对滚动条的位置进行捕捉 与计算
通过计算后 来执行 虚化操作
如需 转载请声明博客作者
以下是源码:
IncrementalLoadingCollection 对象:
[csharp]
public class IncrementalLoadingCollection<T> : ObservableCollection<T>, ISupportIncrementalLoading
{
// 是否正在异步加载中
private bool _isBusy = false;
// 提供数据的 Func
// 第一个参数:增量加载的起始索引;第二个参数:需要获取的数据量;第三个参数:获取到的数据集合
private Func<int, int, List<T>> _funcGetData;
// 最大可显示的数据量
private uint _totalCount = 0;
private Func<T, T> _actDisposeData;
public int PageIndex = 0;
public uint perCount = 0;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="totalCount">最大可显示的数据量</param>
/// <param name="getDataFunc">提供数据的 Func</param>
public IncrementalLoadingCollection(uint totalCount, Func<int, int, List<T>> getDataFunc, Func<T, T> actDisposeData)
{
_funcGetData = getDataFunc;
_totalCount = totalCount;
_actDisposeData = actDisposeData;
}
/// <summary>
/// 是否还有更多的数据
/// </summary>
public bool HasMoreItems
{
get { return this.Count < _totalCount; }
}
/// <summary>
/// 异步加载数据(增量加载)
/// </summary>
/// <param name="count">需要加载的数据量</param>
/// <returns></returns>
public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
{
perCount = count;
if (_isBusy)
{
return AsyncInfo.Run((token) => Task.Run<LoadMoreItemsResult>(() =>
{
return new LoadMoreItemsResult { Count = (uint)this.Count };
}, token));
}
_isBusy = true;
var dispatcher = Window.Current.Dispatcher;
return AsyncInfo.Run(
(token) =>
Task.Run<LoadMoreItemsResult>(
async () =>
{
try
{
//// 模拟长时任务
await Task.Delay(100);
// 增量加载的起始索引
var startIndex = this.Count;
await dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
() =>
{
PageIndex++;
// 通过 Func 获取增量数据
var items = _funcGetData(startIndex, (int)count);
if (items != null)
foreach (var item in items)
{
this.Add(item);