1

我已经实现了从异步 WinRT 源填充对象的 IListDataAdapter(使用 VirtualizedDataSource)。它几乎按预期工作。我从我的数据源设置了一个具有增量加载的 ListView。看起来 itemsFromIndex() 方法被 WinJS 库在某种无限循环中重复调用。

我简化了我的数据适配器,使其包含对填充列表的引用(以确保我的异步调用没有造成问题)。当我水平滚动时,列表视图会尝试填充自己,但很多时候,它最终会在内部进入一些无限循环。

当我滚动列表视图时,它开始加载项目模板。它不束缚他们。我怎么知道它在循环中?断点和下面的console.log。它只是继续疯狂地消耗我的处理器。有谁知道这里发生了什么?

这是我的 itemsFromIndex 的代码。没什么特别的。

itemsFromIndex: function (requestIndex, countBefore, countAfter) {

    var length = this._isupportincrementalloadcollection.size;

    if (requestIndex >= length) {
        return WinJS.Promise.wrapError(new WinJS.ErrorFromName(WinJS.UI.FetchError.doesNotExist));
    }

    var start = Math.max(requestIndex - countBefore, 0);
    var end = Math.min(requestIndex + countAfter, length - 1);

    var items = [];
    for (var i = start; i <= end; i++) {
        var item = this._itemFromIndex(i);
        items.push(item);
    }

    console.log("returning");
    return WinJS.Promise.wrap({
        absoluteIndex: requestIndex,
        atEnd: end === length - 1,
        atStart: start === 0,
        items: items,
        offset: requestIndex - start,
        totalCount: length
    });
}

我的 ListView 设置了以下选项:

loadingBehavior: 'incremental', 
pagesToLoad: 4, 
automaticallyLoadPages: true, 
pagesToLoadThreshold: 1,
4

2 回答 2

2

我的意思是将其添加为原始答案的评论,但正确格式化太多了。无论如何,我今天遇到了这个问题,想澄清一下:

IIListDataAdapter.itemsFromIndex()必须返回一个Promise本身返回一个IFetchResult

IFetchResult = {
    items: [Array],
    offset: [int],
    totalCount: [int]
};

IFetchResult.items必须是对象数组IItem

IItem = {
    key: [string],
    data: [Object]
};

key属性不需要是唯一的,它只需要是项目索引的字符串化版本(即。42.toString();)。

MSDN 上的教程并没有很好地说明必要的成分,但我发现他们的示例源中的场景 4可以。

试一试:http : //code.msdn.microsoft.com/windowsapps/ListView-custom-data-4dcfb128

于 2012-11-16T06:59:26.553 回答
2

原来适配器非常好,问题是钥匙。IListDataAdapter 期望返回的数据是一个包含对象键和对象本身的对象。密钥必须是唯一的字符串。如果键不是字符串,就会发生坏事。如果密钥不是唯一的,坏事就会发生。在上面的代码中,您看不到键的使用位置,但我有一个正在使用的键映射函数。

于 2012-10-19T21:55:03.293 回答