0

Android 用の html アプリケーションを開発しており、リスト ビューで画像を読み込もうとしています。リスト アイテムに固有のデータは、複数の xml ファイルによって提供されています。私は ajax を使用して xml ファイルをロードし、リスト項目を設定しています。ここで直面している問題は、164 個のリスト アイテムがあることです。したがって、164 個の画像と 10 個の xml ファイルをロードする必要があります。私のローダー関数は、2回の反復後に使い果たされます。xml ファイルは読み取りますが、リスト アイテムを動的に作成し、2 回繰り返した後に画像を入力することはできません。スタックの制限によるものだと思います。別の解決策が思い浮かびません。誰かが非常に高く評価される代替ソリューションを提案できれば。以下は私のローダー機能です。これは再帰関数です。

function loadChannels() {

        $.ajax({
            type: "GET",
            url: curURL,
            dataType: "xml",
            error: function(){ console.log('Error Loading Channel XML'); },
            success: function(nXml) {
                var noOfItems = parseInt($($(nXml).find('total_items')[0]).text(), 10);
                var startIdx = parseInt($($(nXml).find('item_startidx')[0]).text(), 10);

                var allItems = $(nXml).find('item');


                $(allItems).each(function() {
                    var obj = $("<li><span id='cont-thumb'></span><span id='cont-name'></span></li>");
                    $("#content-scroller ul").append($(obj));

                    var imgURL = $($(this).find('item_image')[0]).text();
                    var contThumb = $(obj).children()[0];
                    $(contThumb).css("background-image", 'url('+imgURL+')');
                    var name = $($(this).find('name')[0]).text();
                    var contName = $(obj).children()[1];
                    $(contName).text(name).css('text-align', 'center');
                    var url = $($(this).find('link')[0]).text();
                    $(obj).data('item_link', url);
                    $(obj).bind('click', onJPContSelected);                
                });

                if(startIdx+allItems.length < noOfItems){

                    var newIdx = new Number(startIdx+allItems.length);
                    var tokens = curURL.split("/");
                    tokens[tokens.length-2] = newIdx.toString(10);
                    curURL = "http:/";
                    for(var i=2; i<tokens.length; i++)
                        curURL = curURL + "/" + tokens[i];

                    loadChannels();
                }
            }
        });
    }
4

1 に答える 1

1

外側のループで再帰を削除してみてください - そのようなもの:

function loadChannels(){
    var stopFlag = false;
    // request the pages one after another till done
    while(!stopFlag) 
    {
        $.ajax({
            type: "GET",
            url: curURL,
            dataType: "xml",
            error: function(){ 
                console.log('Error Loading Channel XML'); 
                errorFlaf = true;
            },
            success: function(nXml) {
                var noOfItems = parseInt($($(nXml).find('total_items')[0]).text(), 10);
                var startIdx = parseInt($($(nXml).find('item_startidx')[0]).text(), 10);
                var allItems = $(nXml).find('item');
                $(allItems).each(function() {
                    var obj = $("<li><span id='cont-thumb'></span><span id='cont-name'></span></li>");
                    $("#content-scroller ul").append($(obj));

                    var imgURL = $($(this).find('item_image')[0]).text();
                    var contThumb = $(obj).children()[0];
                    $(contThumb).css("background-image", 'url('+imgURL+')');
                    var name = $($(this).find('name')[0]).text();
                    var contName = $(obj).children()[1];
                    $(contName).text(name).css('text-align', 'center');
                    var url = $($(this).find('link')[0]).text();
                    $(obj).data('item_link', url);
                    $(obj).bind('click', onJPContSelected);                
                });

                if(startIdx+allItems.length < noOfItems){

                    var newIdx = new Number(startIdx+allItems.length);
                    var tokens = curURL.split("/");
                    tokens[tokens.length-2] = newIdx.toString(10);
                    curURL = "http:/";
                    for(var i=2; i<tokens.length; i++)
                        curURL = curURL + "/" + tokens[i];

                    // lets disable the recursion
                    // loadChannels();
                }
                else {
                    stopFlag = true;
                }
            }
        });        
    }
}
于 2012-04-24T19:07:50.883 に答える