_updateVisibleRows: function()

in deprecated-react-native-listview/index.js [661:738]


  _updateVisibleRows: function(updatedFrames?: Array<Object>) {
    if (!this.props.onChangeVisibleRows) {
      return; // No need to compute visible rows if there is no callback
    }
    if (updatedFrames) {
      updatedFrames.forEach(newFrame => {
        this._childFrames[newFrame.index] = {...newFrame};
      });
    }
    const isVertical = !this.props.horizontal;
    const dataSource = this.props.dataSource;
    const visibleMin = this.scrollProperties.offset;
    const visibleMax = visibleMin + this.scrollProperties.visibleLength;
    const allRowIDs = dataSource.rowIdentities;

    const header = this.props.renderHeader && this.props.renderHeader();
    let totalIndex = header ? 1 : 0;
    let visibilityChanged = false;
    const changedRows = {};
    for (let sectionIdx = 0; sectionIdx < allRowIDs.length; sectionIdx++) {
      const rowIDs = allRowIDs[sectionIdx];
      if (rowIDs.length === 0) {
        continue;
      }
      const sectionID = dataSource.sectionIdentities[sectionIdx];
      if (this.props.renderSectionHeader) {
        totalIndex++;
      }
      let visibleSection = this._visibleRows[sectionID];
      if (!visibleSection) {
        visibleSection = {};
      }
      for (let rowIdx = 0; rowIdx < rowIDs.length; rowIdx++) {
        const rowID = rowIDs[rowIdx];
        const frame = this._childFrames[totalIndex];
        totalIndex++;
        if (
          this.props.renderSeparator &&
          (rowIdx !== rowIDs.length - 1 || sectionIdx === allRowIDs.length - 1)
        ) {
          totalIndex++;
        }
        if (!frame) {
          break;
        }
        const rowVisible = visibleSection[rowID];
        const min = isVertical ? frame.y : frame.x;
        const max = min + (isVertical ? frame.height : frame.width);
        if ((!min && !max) || min === max) {
          break;
        }
        if (min > visibleMax || max < visibleMin) {
          if (rowVisible) {
            visibilityChanged = true;
            delete visibleSection[rowID];
            if (!changedRows[sectionID]) {
              changedRows[sectionID] = {};
            }
            changedRows[sectionID][rowID] = false;
          }
        } else if (!rowVisible) {
          visibilityChanged = true;
          visibleSection[rowID] = true;
          if (!changedRows[sectionID]) {
            changedRows[sectionID] = {};
          }
          changedRows[sectionID][rowID] = true;
        }
      }
      if (!isEmpty(visibleSection)) {
        this._visibleRows[sectionID] = visibleSection;
      } else if (this._visibleRows[sectionID]) {
        delete this._visibleRows[sectionID];
      }
    }
    visibilityChanged &&
      this.props.onChangeVisibleRows(this._visibleRows, changedRows);
  },