2013-03-17 4 views
0

Я пытаюсь сортировать json-канал, прежде чем вставлять его в виде таблицы. У меня есть метод, который отлично работает на iOS, однако, когда я пытаюсь реализовать тот же код на android, он будет сортировать только один раз.sort table view titanium android

Мне нужно, чтобы данные были отсортированы как минимум дважды для приложения.

Ti.App.addEventListener('get.stands', function(d) { 

     jsonArray = JSON.parse(d.responseText); 

     var hockey = jsonArray; 

     //alert('Hockey Standings'); 
     //Ti.API.info('My data is..' + hockey); 


     function sortBy(prop) { 
      return function(a, b) { 
       if (a[prop] > b[prop]) { 
        return -1; 
       } else if (a[prop] < b[prop]) { 
        return 1; 
       } 
       return 0; 
      } 
      //hockey.sort(sortBy('conference')); 
      //hockey.sort(sortBy('points')); 
     } 

     var data = []; 


     hockey.sort(sortBy('points')); 
     hockey.sort(sortBy('division')); 
     hockey.sort(sortBy('conterence')); 
     //myPoints.sort(function(a,b){return a - b;}); 
     var addRow = function(obj) { 
      var teamPoint = parseInt(obj.points); 
      var row = Ti.UI.createTableViewRow({ 
       backgroundColor : '#fff', 
       //hasChild : true, 
       height : '50dp', 
       width : Ti.UI.SIZE 
      }); 

      var myTeam = Ti.UI.createLabel({ 
       color : '#000', 
       font : { 
        fontSize : 16, 
        fontWeight : 'bold' 
       }, 
       height : Ti.UI.SIZE, 
       highlightedColor : '#fff', 
       left : '55dp', 
       top : '0dp', 
       text : obj.team, 
       width : Ti.UI.SIZE 
      }); 

      var teamPoints = Ti.UI.createLabel({ 
       color : '#666', 
       font : { 
        fontSize : 14 
       }, 
       height : Ti.UI.SIZE, 
       highlightedColor : '#ddd', 
       left : '55dp', 
       top : '20dp', 
       text : 'Points: ' + teamPoint.toFixed(0), 
       //top: 5, 
       width : Ti.UI.SIZE 
      }); 

      var teamImage = Ti.UI.createImageView({ 
        image : 'http://www.corliosity.com/json/' + obj.img, 
        left : '0dp', 
        top : '0dp', 
        height: 50, 
        width: 50 
      }); 
       if (obj.conference) 
       { 
        row.add(myTeam); 
       } 
       if (obj.team) 
       { 
        row.add(myTeam); 
        row.add(teamPoints); 
        row.add(teamImage); 
       } 
      return row; 
     }; 
     var intItem = 0, intItems = hockey.length, strLastDivision = '', row; 

     for (intItem = 0; intItem < intItems; intItem = intItem + 1) { 
      var bgcolor = (intItem % 2) ? '#fff' : "#ccc"; 


      row = addRow(hockey[intItem]); 
      if (strLastDivision !== hockey[intItem].division) { 
       strLastDivision = hockey[intItem].division; 
       row.header = hockey[intItem].division; 
      } 

      data.push(row); 
      row.setBackgroundColor(bgcolor); 
     }; 

     var tbl = Ti.UI.createTableView({ 
      data : data, 
      height : Ti.UI.FILL, 
      //minRowHeight: 80, 
      //search: search, 
      //style : Ti.UI.iPhone.TableViewStyle.GROUPED, 
      width : Ti.UI.FILL 
     }); 

     win.add(tbl); 

    }); 

И код JSON будет выглядеть следующим образом

[{"team":"team1", "points":"18", "division":"west","conference":"west"}, {"team":"team2","points":"23","division":"south","conference":"east"}] 

Спасибо за вашу помощь, заранее

+0

Почему вам нужно сортировать дважды. из вашего кода я вижу, что вы вызываете 'sort' 3 раза, но я не вижу, где вы хотите сортировать дважды? –

+0

В идеале я хотел бы сортировать данные три раза, но я должен иметь сортировку данных по крайней мере по пунктам и по делению. К сожалению, код будет выполнять только одну из функций сортировки. –

+0

Вы пытались отладить это через эмулятор? возможно, вам нужно использовать 'hockey = hockey.sort (sortBy ('...'));' каждый раз ... –

ответ

0
[{"team":"team1", "points":"18", "division":"west","conference":"west"}, {"team":"team2","points":"23","division":"south","conference":"east"}] 

Если это реальный ответ JSON, кажется, что ваши номера доставляются как строки. Если это правильно, вы должны убедиться, что числа сравниваются (я не знаком с JS-переводом Titanium для Android и, возможно, Titanium пытается сравнить строки. Поведение JS иногда отличается от iOS и Android). См. Функции parseInt или parseFloat. Here are some examples.

function sortBy(prop) { 
    return function(a, b) { 
     if (parseInt(a[prop]) > parseInt(b[prop])) { 
      return -1; 
     } else if (parseInt(a[prop]) < parseInt(b[prop])) { 
      return 1; 
     } 
     return 0; 
    } 
} 
+0

Я выполняю все данные с помощью этой функции. Я попытался использовать parseInt, а затем вернул большее число, однако он дал те же результаты. –

+0

Тогда вы можете только попробовать отладить функции. Поместите туда некоторые лог-файлы и проверите их с помощью logcat, если вы запустите его на устройстве. –