public void generateChildContentViews(
      DataItem item, TiUIView parentContent, TiBaseListViewItem rootItem, boolean root) {

    ArrayList<DataItem> childrenItem = item.getChildren();
    for (int i = 0; i < childrenItem.size(); i++) {
      DataItem child = childrenItem.get(i);
      TiViewProxy proxy = child.getViewProxy();
      TiUIView view = proxy.createView(proxy.getActivity());
      view.registerForTouch();
      generateChildContentViews(child, view, rootItem, false);
      // Bind view to root.

      ViewItem viewItem = new ViewItem(view, new KrollDict());
      rootItem.bindView(child.getBindingId(), viewItem);
      // Add it to view hierarchy
      if (root) {
        rootItem.addView(view.getNativeView(), view.getLayoutParams());
      } else {
        parentContent.add(view);
      }
    }
  }
  public void populateViews(
      KrollDict data,
      TiBaseListViewItem cellContent,
      TiListViewTemplate template,
      int itemIndex,
      int sectionIndex,
      View item_layout) {
    Object cell = cellContent.getTag();
    // Handling root item, since that is not in the views map.
    if (!(cell instanceof TiListItem)) {
      Log.e(TAG, "Cell is not TiListItem. Something is wrong..", Log.DEBUG_MODE);
      return;
    }

    TiListItem listItem = (TiListItem) cell;
    KrollDict listItemProperties;
    String itemId = null;

    if (data.containsKey(TiC.PROPERTY_PROPERTIES)) {
      listItemProperties = new KrollDict((HashMap) data.get(TiC.PROPERTY_PROPERTIES));
    } else {
      listItemProperties = template.getRootItem().getDefaultProperties();
    }

    // find out if we need to update itemId
    if (listItemProperties.containsKey(TiC.PROPERTY_ITEM_ID)) {
      itemId = TiConvert.toString(listItemProperties.get(TiC.PROPERTY_ITEM_ID));
    }

    // update extra event data for list item
    appendExtraEventData(listItem, itemIndex, sectionIndex, TiC.PROPERTY_PROPERTIES, itemId);

    HashMap<String, ViewItem> views = (HashMap<String, ViewItem>) cellContent.getViewsMap();
    // Loop through all our views and apply default properties
    for (String binding : views.keySet()) {
      DataItem dataItem = template.getDataItem(binding);
      ViewItem viewItem = views.get(binding);
      TiUIView view = viewItem.getView();
      // update extra event data for views
      if (view != null) {
        appendExtraEventData(view, itemIndex, sectionIndex, binding, itemId);
      }
      // if binding is contain in data given to us, process that data, otherwise
      // apply default properties.
      if (data.containsKey(binding) && view != null) {
        KrollDict properties = new KrollDict((HashMap) data.get(binding));
        KrollDict diffProperties = viewItem.generateDiffProperties(properties);
        if (!diffProperties.isEmpty()) {
          view.processProperties(diffProperties);
        }

      } else if (dataItem != null && view != null) {
        KrollDict diffProperties = viewItem.generateDiffProperties(dataItem.getDefaultProperties());
        if (!diffProperties.isEmpty()) {
          view.processProperties(diffProperties);
        }
      } else {
        Log.w(
            TAG,
            "Sorry, " + binding + " isn't a valid binding. Perhaps you made a typo?",
            Log.DEBUG_MODE);
      }
    }

    // process listItem properties
    KrollDict listItemDiff = cellContent.getViewItem().generateDiffProperties(listItemProperties);
    if (!listItemDiff.isEmpty()) {
      listItem.processProperties(listItemDiff);
    }
  }