2015-04-08 3 views
6

Sto usando un ListView come selettore, tutto funziona, ma non riesco a cambiare lo stato visivo dell'elemento della lista:Come cambiare un ListView Oggetto come codificato React-Native

this.state = { 
    dataSource: dataSource.cloneWithRows([ 
         { 
          provincia:"Bocas del Toro", 
          capital: "Bocas del Toro", 
          selected:false, 
         }, 
         { 
          provincia:"Coclé", 
          capital: "Penonomé", 
          selected:false, 
         }, 
... 

cambio i dati onPress direttamente in questo modo:

rowPressed(rowData) { 
    rowData.selected = true; 
    this.props.onAreaSelect(rowData); 
} 

e cerco di cambiare la vista in questo modo:

<TouchableHighlight onPress={() => this.rowPressed(rowData)} 
     underlayColor='#eeeeee' > 
    <View> 
     <View style={[styles.rowContainer, this.state.selected ? styles.selected : styles.unselected ]}> 
     <View style={styles.textContainer}> 
      <Text style={styles.title} 
        numberOfLines={1}>{rowData.provincia}</Text> 
      <Text style={styles.description} 
        numberOfLines={1}>Capital: {rowData.capital}</Text> 
     </View> 

     </View> 
     <View style={styles.separator} /> 
    </View> 
    </TouchableHighlight> 

Dove styles.selected e styles.unselected sono solo 2 diversi stili definiti.

+0

in onPress, perché dobbiamo usare 'onPress = {() => this.rowPressed (rowData)}'? In altre viste in cui 'TouchableHighlight' non è in un ListView, posso semplicemente usare' onPress = {this.rowPressed (rowData)} ', ma perché qui devo aggiungere l'extra'() => '? –

risposta

3

Non riesco a capire cosa fa il tuo onAreaSelect qui, ma ho riscontrato il problema simile e il trucco è impostare lo stato dataSource in modo che corrisponda al tuo rowData modificato.

this.setState({ 
    dataSource: this.state.dataSource.cloneWithRows(
    // your new data here 
) 
}); 

un'applicazione dettagliata, Reagire Native esempio ufficiale ListView mi ha aiutato. https://facebook.github.io/react-native/docs/listview.html#examples

Nel loro esempio, usano un altro scopo _pressData per memorizzare gli riga viene selezionata, e ogni volta che è cambiato, si chiamano _genRows per ottenere il risultato.

+0

in onPress, perché dobbiamo usare 'onPress = {() => this.rowPressed (rowData)}'? In altre viste in cui 'TouchableHighlight' non è in un ListView, posso semplicemente usare' onPress = {this.rowPressed (rowData)} ', ma perché qui devo aggiungere l'extra'() => '? –

+1

il motivo per cui aggiungi extra() => è perché vuoi passare una funzione che verrebbe eseguita suPress anziché semplicemente chiamarla durante il rendering. Se non lo aggiungi, mentre viene eseguito il rendering verrà chiamato immediatamente anziché solo onPress. –