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

filtering through multiple labels in one row (Appcelerator)

本文关键字:标签 Appcelerator 过滤 一行      更新时间:2023-09-26

我创建了一个表,其中填充了远程数据。我通过创建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没有被填充。当我在最后发出警报时(就在我关闭功能之前),我收到了这个奇怪的错误消息(它没有给我任何信息):

[Ljava.lang.Object;@43f0e008

有人能帮帮我吗?我真的很困。

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

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);
});

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