对本机listview进行排序

对本机listview进行排序,listview,react-native,listitem,Listview,React Native,Listitem,我正在尝试在react native视图中对列表进行排序 -触发sortArrayAsc函数的onClick正在工作 -SortarayASC结果集正在工作 -取消对调试器部分的注释将显示数据源中的值按新排序的顺序排列 我的问题是,我认为使用setState会自动重新呈现列表。。。但事实并非如此 如果没有,你知道我错过了什么或该怎么做吗? 如有任何指导/代码更新,将不胜感激 干杯 导出默认类主屏幕扩展组件{ 建造师(道具){ 超级(道具); dataSource=newListView.data

我正在尝试在react native
视图中对列表进行排序
-触发sortArrayAsc函数的onClick正在工作
-SortarayASC结果集正在工作
-取消对调试器部分的注释将显示数据源中的值按新排序的顺序排列
我的问题是,我认为使用setState会自动重新呈现列表。。。但事实并非如此

如果没有,你知道我错过了什么或该怎么做吗?
如有任何指导/代码更新,将不胜感激
干杯

导出默认类主屏幕扩展组件{
建造师(道具){
超级(道具);
dataSource=newListView.dataSource({rowHasChanged:(r1,r2)=>r1!==r2});
sortedData=数据;
this.state={dataSource:dataSource.cloneWithRows(sortedData)};
}
SortarayASC(数组,键){
返回array.sort(函数(a,b){
控制台信息(b.金额)
返回b.金额a.金额?1
: 0
})
}
_onPress(){
sortedData=this.sortArrayAsc(sortedData,'amount')
让dataSource=this.state.dataSource.cloneWithRows(sortedData)
//调试器
this.setState=(this.state.dataSource:dataSource)
}
_renderRow(行数据,节ID){
返回(
{this.\u onPress()}}
...
/>
)
}
render(){
返回(
)
}
};

对于设置状态,您可以尝试以下方法:

this.setState({dataSource:dataSource})


尝试将控制台记录为渲染

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

let ds=new ListView.DataSource({rowHasChanged:(r1,r2)=>r1!==r2});
导出默认类主屏幕扩展组件{
建造师(道具){
超级(道具);
sortedData=data;//这一行似乎是多余的,您可以删除它
this.state={dataSource:ds.cloneWithRows(data)};//我使用了ds,只是为了名称的改变
}
SortarayASC(数组,键){
返回array.sort(函数(a,b){
控制台信息(b.金额)
返回b.金额a.金额?1
: 0
})
}
_onPress(){
sortedData=this.sortArrayAsc(sortedData,'amount')
//不需要这些线路
/*let dataSource=//this.state.dataSource.cloneWithRows(sortedData)*/
//调试器
//this.setState=(this.state.dataSource:dataSource)
/*您应该在react文档中查找设置状态(https://facebook.github.io/react/docs/react-component.html),您可能正在尝试使用
this.setState((prevState,props)=>{
返回{myInteger:prevState.myInteger+props.step};
});*/
这是我的国家({
数据源:ds.cloneWithRows(sortedData)
});
}
_renderRow(行数据,节ID){
返回(
{this.\u onPress()}}
...
/>
)
}
render(){
返回(
)
}

};
您是否可以尝试将
数组
传递给dataSource.cloneWithRows(数组)而不是
对象

我不确定您的
sortedData
array
还是
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)
})
致:


我的问题解决了。

您好,谢谢您的更新。不幸的是,它没有更新视图列表:-(嗨,在Manjeet的更新之后,这一点也是必需的:-)即在我最初的setState代码中使用大括号。感谢您对此进行审阅/评论,Kush R。您好,非常感谢您在整个过程中以及
setState
链接中提供评论。我使用您的解决方案调试了我的原始版本,它归结为
中的
this.state
,让dataSource=this.state.dataSource.cloneWithRows(sortedData)
行我包括
this.state
最初是因为我得到了
无法读取cloneWithRows
的错误,这解决了问题。不幸的是,这只是掩盖了问题!!因此,这一单行更改
dataSource=dataSource.cloneWithRows(sortedData)
正在运行。我还将加入您的其他要点:-)干杯
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)
})