render: function()

in deprecated-react-native-listview/index.js [403:539]


  render: function() {
    const bodyComponents = [];

    const dataSource = this.props.dataSource;
    const allRowIDs = dataSource.rowIdentities;
    let rowCount = 0;
    const stickySectionHeaderIndices = [];

    const {renderSectionHeader} = this.props;

    const header = this.props.renderHeader && this.props.renderHeader();
    const footer = this.props.renderFooter && this.props.renderFooter();
    let totalIndex = header ? 1 : 0;

    for (let sectionIdx = 0; sectionIdx < allRowIDs.length; sectionIdx++) {
      const sectionID = dataSource.sectionIdentities[sectionIdx];
      const rowIDs = allRowIDs[sectionIdx];
      if (rowIDs.length === 0) {
        if (this.props.enableEmptySections === undefined) {
          const warning = require('fbjs/lib/warning');
          warning(
            false,
            'In next release empty section headers will be rendered.' +
              " In this release you can use 'enableEmptySections' flag to render empty section headers.",
          );
          continue;
        } else {
          const invariant = require('invariant');
          invariant(
            this.props.enableEmptySections,
            "In next release 'enableEmptySections' flag will be deprecated, empty section headers will always be rendered." +
              ' If empty section headers are not desirable their indices should be excluded from sectionIDs object.' +
              " In this release 'enableEmptySections' may only have value 'true' to allow empty section headers rendering.",
          );
        }
      }

      if (renderSectionHeader) {
        const element = renderSectionHeader(
          dataSource.getSectionHeaderData(sectionIdx),
          sectionID,
        );
        if (element) {
          bodyComponents.push(
            React.cloneElement(element, {key: 's_' + sectionID}),
          );
          if (this.props.stickySectionHeadersEnabled) {
            stickySectionHeaderIndices.push(totalIndex);
          }
          totalIndex++;
        }
      }

      for (let rowIdx = 0; rowIdx < rowIDs.length; rowIdx++) {
        const rowID = rowIDs[rowIdx];
        const comboID = sectionID + '_' + rowID;
        const shouldUpdateRow =
          rowCount >= this._prevRenderedRowsCount &&
          dataSource.rowShouldUpdate(sectionIdx, rowIdx);
        const row = (
          <StaticRenderer
            key={'r_' + comboID}
            shouldUpdate={!!shouldUpdateRow}
            render={this.props.renderRow.bind(
              null,
              dataSource.getRowData(sectionIdx, rowIdx),
              sectionID,
              rowID,
              this._onRowHighlighted,
            )}
          />
        );
        bodyComponents.push(row);
        totalIndex++;

        if (
          this.props.renderSeparator &&
          (rowIdx !== rowIDs.length - 1 || sectionIdx === allRowIDs.length - 1)
        ) {
          const adjacentRowHighlighted =
            this.state.highlightedRow.sectionID === sectionID &&
            (this.state.highlightedRow.rowID === rowID ||
              this.state.highlightedRow.rowID === rowIDs[rowIdx + 1]);
          const separator = this.props.renderSeparator(
            sectionID,
            rowID,
            adjacentRowHighlighted,
          );
          if (separator) {
            bodyComponents.push(<View key={'s_' + comboID}>{separator}</View>);
            totalIndex++;
          }
        }
        if (++rowCount === this.state.curRenderedRowsCount) {
          break;
        }
      }
      if (rowCount >= this.state.curRenderedRowsCount) {
        break;
      }
    }

    const {renderScrollComponent, ...props} = this.props;
    if (!props.scrollEventThrottle) {
      props.scrollEventThrottle = DEFAULT_SCROLL_CALLBACK_THROTTLE;
    }
    if (props.removeClippedSubviews === undefined) {
      props.removeClippedSubviews = true;
    }
    Object.assign(props, {
      onScroll: this._onScroll,
      stickyHeaderIndices: this.props.stickyHeaderIndices.concat(
        stickySectionHeaderIndices,
      ),

      // Do not pass these events downstream to ScrollView since they will be
      // registered in ListView's own ScrollResponder.Mixin
      onKeyboardWillShow: undefined,
      onKeyboardWillHide: undefined,
      onKeyboardDidShow: undefined,
      onKeyboardDidHide: undefined,
    });

    return cloneReferencedElement(
      renderScrollComponent(props),
      {
        ref: this._setScrollComponentRef,
        onContentSizeChange: this._onContentSizeChange,
        onLayout: this._onLayout,
        DEPRECATED_sendUpdatedChildFrames:
          typeof props.onChangeVisibleRows !== undefined,
      },
      header,
      bodyComponents,
      footer,
    );
  },