JQuery Mobile.listview('refresh') не работает

Я создаю мобильное веб-приложение с jQuery Mobile, и у меня есть проблема. Я использую jQuery для анализа XML файла и создания элементов списка. Он создает список, затем добавляет этот список <li> к <ul> на странице. Я прочитал, что для правильного написания списка вы должны вызвать .listview('refresh') после добавления данных для обновления списка, чтобы jQuery Mobile мог установить правильный стиль в список.

Моя проблема в том, что список никогда не обновляется. Он продолжает ошибочно оформляться. Я делаю что-то неправильно? Правильно ли мой код? FYI, я пробовал всевозможные варианты .listview(), .listview('refresh') и т.д.

CODE:

<script type="text/javascript">
  $(window).load(function() {
    $.ajax({
      type: "GET",
      url: "podcast.xml",
      dataType: "xml",
      async: false,
      success: parseXml
    });
  });

  function parseXml(xml) {
    var podcastList = "";
    $(xml).find("item").each(function() {
      podcastList += "<li class='ui-li-has-thumb ui-btn ui-btn-icon-right ui-li ui-btn-up-c' role='option' data-theme='c'><img src='" + $(this).find("itunes\\:image").attr("href") + "' class='ui-li-thumb'><h3 class='ui-li-heading'><a href='" + $(this).find("enclosure").attr("url") + "' class='ui-link-inherit'>" + $(this).find("title").text() + "</a></h3><p class='ui-li-desc'>" + $(this).find("itunes\\:subtitle").text() + "</p></li>";
    });
    $("#podcastList").append(podcastList);
    $("#podcastList").listview('refresh');
  }
</script>

Спасибо!

Ответ 1

Я столкнулся с этой проблемой с кодом, похожим на ваш. Мое решение состояло в том, чтобы поместить обновление в опцию $.ajax "complete".

        complete: function() {
            $('#list-id').listview('refresh');
        } 

Ответ 2

Мое решение состояло в том, чтобы не использовать никаких параметров в методе listview, как в

<div data-role="page" id="playlist">
    <div data-role="header">
        <h1>my playlist</h1>
        <a href="index.html" data-icon="arrow-l">Back</a>
    </div>
    <div data-role="content"></div>
</div>

end then..

$('#playlist').bind('pageshow', function () {
    doOnCallBack = function(){
        $('#playlist').find('[data-role="listview"]').listview();
    }
    ajaxGet('${genSecureLink(action:'updatePlaylistTemplate',controller:'ajaxActionsPd',absolute:'true')}',$('#playlist').find('[data-role="content"]'),doOnCallBack);
});

вот моя функция ajaxGet:

function ajaxGet(url,target,doOnCallBack){
    $.ajax({
        url: url,
        error:function(x,e){handleAjaxError(x,e);},
        beforeSend:function(){$.mobile.showPageLoadingMsg();},
        complete:function(){$.mobile.hidePageLoadingMsg();doOnCallBack();},
        success:function(data, textStatus, jqXHR){target.html(data);}
    });
}

Ответ 3

Ответ на спайк работал у меня - я нацелился на родительский div ul. Мне также необходимо связать функцию ajax с pagecreate - это:

<div data-role="page" data-theme="b" id="my-page">
    <div data-role="header">
        <h1>Podcast List</h1>
    </div>
    <div data-role="content">
        <ul id="podcastList" data-role="listview">
        </ul>
    </div>
</div>
<script>
$('#mypage').bind('pagecreate',function(){
  // instead of $(window).load(function(){
        $.ajax({
            type: "GET",
            url: "podcast.xml",
            dataType: "xml",
            async: false,
            success: parseXml
            complete: function() {
               $('#podcastList').listview('refresh');
            } 
        });
 });
</script>

Ответ 4

$("#podcastList").trigger("create");

Ответ 5

Ваш код выглядит хорошо для меня... Похоже на то, что у меня в моем приложении.

Возможно, проблема кроется в вашем HTML? Он должен выглядеть примерно так:

<div data-role="page" data-theme="b" id="my-page">
    <div data-role="header">
        <h1>Podcast List</h1>
    </div>
    <div data-role="content">
        <ul id="podcastList" data-role="listview">
        </ul>
    </div>
</div>