これは以前に尋ねられたことが分かりました。例えば、here、hereおよびhereを参照してください。React Native ListView:削除時に間違った行が削除される
しかし、回答/コメントはいずれも満足できるものではありません。彼らは、問題を解決しないデータを複製するか、または問題を解決するが、新しいものを作成するListViewに一意のキーを設定するように指示します。
ListViewに一意のキーを設定し、削除後に更新すると、ビュー全体が再びレンダリングされ、上にスクロールされます。アイテムを削除するためにリストを下にスクロールしたユーザは、リストがその位置を維持することを期待する。
var ListViewExample = React.createClass({
getInitialState() {
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => {
r1 !== r2
}});
var rows = ['row 1', 'row 2', 'row 3'];
return {
dataSource: ds.cloneWithRows(rows),
};
},
_deleteRow() {
var rows = ['row 1', 'row 3'];
this.setState({dataSource: this.state.dataSource.cloneWithRows(rows)})
},
renderRow(rowData, sectionID, rowID) {
return <TouchableOpacity onPress={this._deleteRow}
style={{height: 60, flex: 1, borderBottomWidth: 1}}>
<Text>{rowData}</Text>
</TouchableOpacity>
},
render() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this.renderRow}
/>
);
}
});
そしてhereあなたは間違った行取得者が削除アクションでそれのGIF画像を見ることができます:
は、ここで私は、データを複製するのが正しい方法だった引き受けるものを使用して、不自然な例です。代わりに、ListViewのkey
小道具を設定すると、正しい行が削除されますが、私が言ったように、リストが上にスクロールする原因になります。
UPDATE
私はすでに以下のネーダーの答えを受け入れてきましたが、これは、それがデータソースにrowHasChanged
を呼び出すことはありませんので、正しい方法ではないようです。また、ListViewのドキュメントにも準拠していません。私はそれを残しておきますので、それはオーケー、これは厄介ですが、私のrowHasChanged
機能だった答えとしてマークされたが、私は、これは回避策ではなく、正しい解決策
別の更新
ある感じを持っている私の問題を解決しましたreturn
ステートメントがありません。私のコーヒーにはES6の砂糖が多すぎますね。
あなたrowHasChanged
機能を台無しにあれば結論で、this._ds
は、何らかの理由で動作します。あなたのdataSource
を更新する際
this.setState({
dataSource: this.state.dataSource.cloneWithRows(rows)
});
:あなたは物事を行う場合に開始する正しい方法は、おそらくのようなものを使用する必要があります。
また、新しいrows
データ欄が必要であることを覚えておいてください。 cloneWithRows(rows.push(newRow)
のようなものでそれを突然変異させることはできませんが、cloneWithRows(rows.concat([newRow])
となります。
それが助け場合は他の誰か...私は...クローニング前に私のリストのディープコピーを作っていたため、キーのでcloneWithRowsを行う前にnew_rows = [...行] –