对本机列表视图进行排序

sorting a react-native listview

我正在尝试在我的 react-native 中对列表进行排序 View
- 触发 sortArrayAsc 函数的 onClick 正在工作
- sortArrayAsc 结果集正在运行
- 取消注释调试器部分显示数据源中的值是新排序的顺序
我遇到的问题是,我认为使用 setState 会自动重新呈现列表......这并没有发生。

如果没有,有什么想法我缺少什么或该怎么办?
非常感谢任何指导/代码更新
干杯

export default class HomeScreen extends Component {
  constructor(props) {
    super(props);

    dataSource = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 } );
    sortedData = data;
    this.state = { dataSource: dataSource.cloneWithRows(sortedData) };
  }

  sortArrayAsc(array, key) {
    return array.sort(function (a,b) {
      console.info(b.amount)
      return b.amount < a.amount ? -1
           : b.amount > a.amount ? 1
           : 0
    })
  }

  _onPress() {
    sortedData = this.sortArrayAsc(sortedData, 'amount')
    let dataSource = this.state.dataSource.cloneWithRows(sortedData)
    //debugger
    this.setState = ( this.state.dataSource: dataSource )
  }

  _renderRow (rowData, sectionID) {
    return (
      <ListItem
        ... 
        onPress = { () => { this._onPress() } }
        ...
      />
    )
  }


  render() {
    return (
      <View>
        <List>
          <ListView
            dataSource = {this.state.dataSource}
            renderRow = {this._renderRow.bind(this)}
          />
        </List>
      </View>
    )
  }

};

对于setState,你能试试这个吗:

this.setState({ dataSource: dataSource });

尝试在渲染中记录一个控制台

console.log(this.state.dataSource);

查看它在渲染时是否打印出正确的值。要确保数据源仅在 this.state.dataSource.cloneWithRows(sortedData) 之后设置新值,请将 setState 写入回调函数。

let  ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 } );
export default class HomeScreen extends Component {
  constructor(props) {
    super(props);
    sortedData = data;   // this line seems redundent you can remove this
    this.state = { dataSource:ds.cloneWithRows(data) };//I used ds, just for the shake of name
  }

  sortArrayAsc(array, key) {
    return array.sort(function (a,b) {
      console.info(b.amount)
      return b.amount < a.amount ? -1
           : b.amount > a.amount ? 1
           : 0
    })
  }

  _onPress() {
    sortedData = this.sortArrayAsc(sortedData, 'amount')
    //no need of these lines
    /*let dataSource = //      this.state.dataSource.cloneWithRows(sortedData)*/
    
    //debugger
    //this.setState = ( this.state.dataSource: dataSource )
    /*you should look in the react doc for setState(https://facebook.github.io/react/docs/react-component.html), you may be trying to use 
this.setState((prevState, props) => {
  return {myInteger: prevState.myInteger + props.step};
});*/
    this.setState({
      dataSource:ds.cloneWithRows(sortedData)
    });
  }

  _renderRow (rowData, sectionID) {
    return (
      <ListItem
        ... 
        onPress = { () => { this._onPress() } }
        ...
      />
    )
  }


  render() {
    return (
      <View>
        <List>
          <ListView
            dataSource = {this.state.dataSource}
            renderRow = {this._renderRow.bind(this)}
          />
        </List>
      </View>
    )
  }

};

您可以尝试将 array 传递给 dataSource.cloneWithRows(数组)而不是 object 吗?

我不确定你的 sortedDataarray 还是 object

因为 ListView 我也有问题。呈现的项目与我提供的数据的排序方式不同。

这是我的数据:

let data = {
    key1: object,
    key2: object,
    key3: object,
    key4: object,
    key5: object,
    key6: object
}

这是我使用以下方法记录结果时发现的:

console.log(Object.keys(data))

结果是:

["key3", "key1", "key5", "key4", "key2"]

这与ListView中呈现的项目的顺序相同。所以,我更改了我的代码:

const dataSource = new ListView.DataSource(
    rowHasChanged: (r1, r2) => (r1 !== r2)
})
this.setState({
    ds: dataSource.cloneWithRows(data)
})

至:

let dataArray = []

// Sort the keys out
let keys = Object.keys(data).sort()

// Push them into dataArray
keys.forEach(key => dataArray.push(data[key]))

const dataSource = new ListView.DataSource(
    rowHasChanged: (r1, r2) => (r1 !== r2)
})

// Now I am passing array datatype instead of object datatype.
this.setState({
    dataSource.cloneWithRows(dataArray)
})

我的问题解决了。