фильтрация по нескольким меткам в одной строке (Appcelerator) - PullRequest
0 голосов
/ 28 января 2012

Я создал таблицу, которая заполняется удаленными данными. Я получаю эти данные с помощью PHP-скрипта, который создает XML. 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

Может кто-нибудь, пожалуйста, помогите мне, я действительно застрял с этим.

1 Ответ

0 голосов
/ 29 января 2012

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

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

Надеемся,это полезно для кого-то еще.Дайте мне знать:)

...