通过一行中的多个标签过滤(Appcelerator)

时间:2012-01-28 13:44:01

标签: javascript android tableview appcelerator-mobile

我创建了一个用远程数据填充的表。我正在使用创建xml的php脚本获取此数据。 xml看起来有点像这样:

<kalender>
   <afhaaldag>
      <datum>Monday 30 January 2012</datum>
      <afval>GFT</afval>
      <afval>PMD</afval>
      <afval>Restafval</afval>
   </afhaaldag>
   <afhaaldag>
      <datum>Monday 06 February 2012</datum>
      <afval>GFT</afval>
      <afval>Snoeiresten</afval>
   </afhaaldag>
</kalender>

我设法将所有信息都放在正确的位置。每个'afhaaldag在我的表中有一行,每个标签里面都有一个标签。它看起来像这样:

Monday 30 January 2012
GFT
Snoeiresten
Restafval

Monday 06 February 2012
GFT
Snoeiresten

我正在使用此循环为'afval'添加多个标签:

var allAfval = item.getElementsByTagName('afval');
var subView = Ti.UI.createView({bottom:10});
for(var j = 0; j<allAfval.length; j++)
{
    var afval = allAfval.item(j).text;
    var subLabel = Titanium.UI.createLabel({
        text:afval,
        color:'black',
        left:15,
        top:topPosition+20
    });
    topPosition +=20;
    subView.add(subLabel);
    subLabel.catId = afval;
    dataLabels.push(subLabel);
}
row.add(subView);
table.appendRow(row);

现在我想让用户过滤标签,但由于我在一行中有多个标签,我不能使用我之前的解决方案(在我添加更多'afval'标签之前,它工作正常)。要进行过滤,我使用了一个选择器,使用了这个eventListener:

picker.addEventListener('change', function(e)
{
    var filteredLabels = [];
    for(var k=0; k<dataLabels.length; k++)
    {
        if(e.row.id == 'alles')
        {
            filteredLabels = dataLabels;
        }
        else if(dataLabels[k].catId == e.row.id)
        {
            filteredLabels[filteredLabels.length] = dataLabels[k];
        }
        table.setData(filteredLabels);
    }
});

问题是我的数组dataLabels由于某种原因未被填充。当我在结束时(在关闭我的函数之前)发出警报时,我得到了这个奇怪的errorMessage(它没有给我任何信息):

  

[Ljava.lang.Object; @ 43f0e008

有人可以帮助我,我真的很难接受。

1 个答案:

答案 0 :(得分:0)

经过很多挫折,但更多的决心,我终于得到了解决方案。我做的是这样的:我创建了一个子视图(因为标签必须排成一行,每行可以有多个标签)并将标签存储在该子视图上(我在此循环之前得到的日期)。我还创建了一个新行(在用户过滤后基本上将替换表中的原始行)并且我将该信息存储在一个新数组中(过滤后将替换数据源)

var allAfval = item.getElementsByTagName('afval');
var subView = Ti.UI.createView({bottom:10});
for(var j = 0; j<allAfval.length; j++)
{
    var afval = allAfval.item(j).text;
    var subRow = Ti.UI.createTableViewRow();
    var subLabel = Titanium.UI.createLabel({
        text:afval,
        color:'black',
        left:15,
        top:topPosition+20
    });
    var subLabelDate = Titanium.UI.createLabel({
        text:datum,
        color:'black',
        font:{fontWeight:'bold'},
        left:15,
        top:topPosition
    });
    topPosition +=20;
    subRow.add(subLabel);
    subRow.add(subLabelDate);
    subView.add(subLabel);
    subRow.catId = afval;
    dataLabels[y++] = subRow;
}
row.add(subView);

使用此eventListener,我会过滤表格,并为用户提供他们想要的信息。数据是原始数据源(因此,如果用户想要查看他们将获得原始表的所有事件,如果他们想要特定事件,他们将获得新数据源)

picker.addEventListener('change', function(e)
{       
    var filteredData = [];
    for(var k=0; k<dataLabels.length; k++)
    {
        if(e.row.id == 'alles')
        {
            filteredData = data;
        }
        else if(dataLabels[k].catId == e.row.id)
        {
            filteredData[filteredData.length] = dataLabels[k];
        }
        table.setData(filteredData);
    }
    table.setData(filteredData);
});

希望它对其他人有用。让我知道:))