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

アダプターは完全に問題がなかったことがわかりました。問題はキーでした。IListDataAdapter は、返されるデータが、オブジェクトのキーとオブジェクト自体を含むオブジェクトであることを想定しています。キーは一意の文字列である必要があります。キーが文字列以外の場合、悪いことが起こります。キーが一意でない場合、悪いことが起こります。上記のコードでは、キーがどこで使用されたかはわかりませんが、使用していたキー マッピング関数がありました。

于 2012-10-19T21:55:03.293 に答える
2

これをコメントとして元の回答に追加するつもりでしたが、正しくフォーマットするには多すぎます。とにかく、私は今日これに遭遇し、少し明確にしたかった:

IIListDataAdapter.itemsFromIndex()Promiseそれ自体が を返す を返さなければなりませんIFetchResult:

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

IFetchResult.itemsIItemオブジェクトの配列でなければなりません:

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 に答える