Подтвердить что ты не робот

Невозможно просмотреть Tableviewrow, нажав на TableViewSection в титановом мобильном приложении

Я разработал одно приложение, основанное на ниже древовидной структуре:

По умолчанию:

  • Категория
  • Категория
  • Категория

При нажатии на категорию:

  • Категория
    • Подкатегория
      • Продукт
  • Категория

  • Категория

Несколько раз:

  • Категория

  • Категория

    • Продукт
  • Категория

Здесь я должен реализовать эту концепцию, используя tableview.

Да, я создал табличное представление, а затем создал таблицу viewsection.i добавил категории  в tableviewsection.i создали tableviewrow в пределах viewviewsection. Если я нажимаю на выбранную категорию, я добавил значения подкатегории в этой таблице. Но какая-то категория, имеющая подкатегорию... некоторые из категорий не имеют подкатегории. У вас есть продукты. Так вы можете объяснить мне

EDIT:

i следует ниже кода:

    // create menu view
var data = [];

var v1 = Ti.UI.createView({
  height: '100%',
  width: '320dp',
  left: '0%',
  backgroundColor: '#212429'
});

$.drawermenu.drawermenuview.add(v1);

var tableView = Ti.UI.createTableView({
  height: '100%',
  width: '100%',
  separatorColor: '#111214',
  allowsSelection: true,
  style: Ti.UI.iPhone.TableViewStyle.GROUPED
});
v1.add(tableView);

var dataArray = [];
getCategoryList();

function getCategoryList() {
  var sendit = Ti.Network.createHTTPClient({
    onerror: function(e) {
      Ti.API.debug(e.error);
      alert('There was an error during the connection');
    },
    timeout: 10000,
  });
  sendit.open('GET', url + 'android_livedev/client/xxx.php?action=allCategory&category=all');
  sendit.send();
  sendit.onload = function() {
    var response = JSON.parse(this.responseText);
    if (response[0].success == 0) {
      tableView.headerTitle = response[0].message;
    } else {
      tableView.headerTitle = "";
      dataArray = [];
      for (var i = 0; i < response[0].data.length; i++) {
        var customsection = Ti.UI.createView({
          width: Ti.UI.FILL,
          height: Ti.UI.SIZE,
          opened: true,
          id: i,
          categorylist_category_id: response[0].data[i].categoryid,
          categorylist_level: response[0].data[i].category_level,
          backgroundcolor: '#fff',
          length: response[0].data.length,
        });

        var text = Ti.UI.createLabel({
          text: response[0].data[i].category,
          left: 20,
          id: i,
          categorylist_category_id: response[0].data[i].categoryid,
          categorylist_level: response[0].data[i].category_level,
          color: '#000'
        });
        customsection.add(text);

        row = Ti.UI.createTableViewSection({
          headerView: customsection,
        });
        dataArray.push(row);
        customsection.addEventListener('click', function(e) {
          categorylist_category_id = e.source.categorylist_category_id;
          categorylist_level = e.source.categorylist_level;
          categorylist_id = e.source.id;
          if (categorylist_level == "Y") {
            var subcategory = [];
            for (j = 0; j < response[0].data[categorylist_id].subcategorymm.length; j++) {
              var subcategory = Ti.UI.createTableViewRow({
                subcategorylist_category_id: response[0].data[categorylist_id].subcategorymm[j].categoryid,
                layout: 'horizontal',
                top: 5,
                width: "100%",
                backgroundcolor: '#000',
                height: Ti.UI.SIZE,
              });

              var subcategorytext = Ti.UI.createLabel({
                text: response[0].data[categorylist_id].subcategorymm[j].category,
                top: 5,
                width: Ti.UI.FILL,
                font: {
                  fontSize: '18dp'
                },
                color: '#040404',
                wordWrap: true,
                height: Ti.UI.SIZE,
                ellipsize: true
              });
              subcategory.add(subcategorytext);

            };

            row.add(subcategory);


          } else {
            from = "Product";
            var product = Alloy.createController('product').getView();
            product.open();
          }
        });
      };
      tableView.setData(dataArray);
    };
  };


}

var top10Screen = Alloy.createController('top10Screen').getView();
$.drawermenu.drawermainview.add(top10Screen);

Ti.App.addEventListener('settingImg', function(data) {
  $.drawermenu.showhidemenu();
});

$.sample.open();

EDIT:

здесь приведен код сплава:

sample.xml:

<Alloy>
    <Window class="container">
        <Require type="widget" src="com.drawermenu.widget" id="drawermenu"/>

    </Window>
</Alloy>

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

это точно мой json:

[
{
    "message": "Category list found",
    "data": [
        {
            "categoryid": "335",
            "parentid": "0",
            "category": "New In",
            "description": "",
            "meta_description": "",
            "avail": "Y",
            "order_by": "0",
            "product_count": "2",
            "top_product_count": "1",
            "meta_keywords": "",
            "override_child_meta": "N",
            "title_tag": "",
            "lpos": "1",
            "rpos": "4",
            "category_level": "Y",
            "new_category_images": "https://dev101.example.com/xxx/images/C/newin.png",
            "subcategorymm": [
                {
                    "categoryid": "344",
                    "parentid": "335",
                    "category": "subcategory-newin",
                    "description": "",
                    "meta_description": "",
                    "avail": "Y",
                    "order_by": "0",
                    "product_count": "1",
                    "top_product_count": "1",
                    "meta_keywords": "",
                    "override_child_meta": "N",
                    "title_tag": "",
                    "lpos": "2",
                    "rpos": "3",
                    "category_level": "N"
                }
            ]
        },
        {
            "categoryid": "336",
            "parentid": "0",
            "category": "Women's",
            "description": "",
            "meta_description": "",
            "avail": "Y",
            "order_by": "1",
            "product_count": "2",
            "top_product_count": "2",
            "meta_keywords": "",
            "override_child_meta": "N",
            "title_tag": "",
            "lpos": "5",
            "rpos": "6",
            "category_level": "N",
            "new_category_images": "https://dev101.example.com/xxx/images/C/women.png"
        }
    ],
    "success": "1"
}
]

Здесь перечислены категории. Но если вы нажмете категорию, она перечислит подкатегорию. Но я не могу просмотреть подкатегорию. Можете ли вы проверить это и дать мне решение.

EDIT:

в этом цикле for:

 for(j=0;j<response[0].data[categorylist_id].subcategorymm.length;j++){

i напечатайте такие значения, как:

 Ti.API.info(response[0].data[categorylist_id].subcategorymm[j].category);

это означает, что подкатегории хорошо печатаются в окне консоли. Но я не могу просмотреть tableviewrow. я знаю, что немного покончил с ошибкой. Также вы можете узнать об ошибке и дать мне решение.

4b9b3361

Ответ 1

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

Я попытаюсь помочь, используя некоторые фрагменты кода, которые я использовал для своего 2-уровневого меню навигации. Логика такая же, но вам придется добавить третий слой самостоятельно.

Меню сборки

Я предполагаю, что в вашем xml у вас есть пустой TableView, который прослушивает событие tap (или click), например:
<TableView id="menuTable" onSingletap="onTap" />

Во время инициализации вы можете вызвать функцию, которая добавит пустые разделы 1-го уровня в ваш TableView.

Чтобы добавить новые строки в эти разделы, определите _createRow, который создает, заполняет и возвращает a Ti.UI.createTableViewRow в зависимости от его type:

_createRow = function(data, type) {
    var row = Ti.UI.createTableViewRow();
    // populate row with some content here...
    // Save some useful info in the row
    row.listId = data.id;
    row.subItems = data.subItems;
    // What type of row are we creating ?
    if (type === 'node') {
        // Category
        row.isParent = true;
    }
    if (type === 'child') {
        // Customise row as a Product
        row.backgroundColor = '#2a2a2a';
    }
    // There could be a third type for Sub-Category
    return row;
};

Затем в каждом разделе вы добавляете строку node, эта строка является родителем, который показывает категорию, и сохраняет некоторую информацию, такую ​​как ее идентификатор категории, ее тип и его подпункты (мы будем использовать это позже).

Событие с щелчком мыши (часть 1)

Если вы получаете событие из TableView, возможны 3 случая:

  • Пользователь нажал Категория → показать/скрыть Подкатегорию
  • Пользователь нажал Подкатегорию → показать/скрыть Продукт
  • Пользователь нажал Продукт → Перейти к продукту

Связанный код находится в конце этого сообщения, так как я сначала объясню, как обрабатывать эти случаи.

Раздел "Открыть" категории

Если раздел уже не был открыт, мы хотим показать, что внутри. Пусть определит функцию _openSection, которая добавит новый раздел сразу после категории, которая была просто нажата. Затем добавьте к этому разделу столько элементов, сколько у вас есть.

function _openSection(index, parentRow) {
    newSection = Ti.UI.createTableViewSection({
        index: parentRow.section.index + 1
    });
    _.each(parentRow.subItems, function(item) {
        newSection.add(_createRow(item, 'child'));
    });
    parentRow.opened = true;
    // Could be animated on iOS:
    $.menuTable.insertSectionAfter(index, newSection);
    // Save which Section is currently open
    currentOpen = newSection;
};

Раздел "Закрыть" категории

То же самое происходит наоборот: уже открытый раздел можно закрыть, нажав на него. Позвольте просто удалить целевой раздел из TableView.

_closeSection = function(index, parentRow) {
    currentOpen = null;
    parentRow.opened = false;
    var removed = $.menuTable.sections[index].rows.length;
    $.menuTable.deleteSection(index);
    return removed;
};

Событие с щелчком мыши (часть 2)

Теперь у вас есть все, что вам нужно, чтобы открыть и закрыть категорию, вот код для ее обработки:

_handleMenu = function(evt) {
    var justify = false, openIndex;
    // Clicked Section is already open
    if (evt.row.opened) {
        return _closeSection(evt.section.index + 1, evt.row);
    } else {
        /* Close currently opened Section, to have only one Category
         * opened at the same time (simplifies the solution a lot)
         */
        if (currentOpen) {
            parentSection = $.menuTable.sections[currentOpen.index - 1];
            parentRow = parentSection.rows[0];
            if (currentOpen.index <= evt.section.index) {
                justify = true;
            }
            removed = _closeSection(parentSection.index + 1, parentRow);
        }
        // Set the index we'll be working with:
        openIndex = evt.index;
        // A Section was closed, change the index:
        if (justify) {
            openIndex -= removed;
        }
        // Workaround for parity on Android
        if (OS_ANDROID) {
            evt.row.section = evt.section;
        }
        return _openSection(openIndex, evt.row);
    }
};

Попробуйте использовать этот код для работы с двумя слоями, а затем реализовать отсутствующий третий уровень для достижения своей цели.
Не стесняйтесь задавать вопросы, если я недостаточно ясен;)
Удачи!