2016-05-21 6 views
0

Прежде всего, я понимаю, что есть пара подобных вопросов, но ни один из ответов не помог.response-native: перерисовать строки в ListView при изменении состояния

В любом случае, у меня есть простой вид списка, и когда я нажимаю на определенную строку, я хочу добавить к ней несколько разных стилей и контента.

В _pressRow я установил state.selected_row и это вновь делает вид, в _renderRow определено, что выбрана строка и стиль применяется надлежащим образом, но по какой-то причине _renderRow только называется на начальной визуализации, как можно сделать его обновлять каждый раз, и почему это уже не происходит?

var List = React.createClass({ 

    getInitialState: function() { 
    var ds = new React.ListView.DataSource({ 
     rowHasChanged: (r1, r2) => r1 !== r2 
    }); 
    return { 
     dataSource: ds.cloneWithRows(some_data), 
     loaded: false, 
     selected_row: null, 
    }  
    }, 

    _renderRow: function(rowData, sectionID, rowID) { 
    var selected = (this.state.selected_row == rowID) 
    return (
     <React.View 
      style={selected ? styles.row_expanded : row_styles.row} 
      onPress={() => this._pressRow(rowID)> 
     </React.View> 
    ) 
    }, 

    _pressRow: function(rowId){ 
    this.setState({ 
     selected_row: rowId, 
    }); 
    }, 

    render: function() { 

     return <React.View> 
     <React.ListView 
      dataSource={this.state.dataSource} 
      renderRow={this._renderRow} 
      style={styles.container} 
     /> 
     </React.View> 

    } 

}); 

ответ

2

Я получил это работает, вставив несколько различных ответов вместе ...

_pressRow: function(rowId){ 

    var clone = this.state.tours.map((item, i) => { 
     return { 
     ...item, 
     selected: i == rowId ? true : false 
     } 
    }); 

    this.setState({ 
     data: clone, 
     selected_row: rowId, 
     dataSource: this.state.dataSource.cloneWithRows(clone) 
    }); 

    }, 

Вы должны явно создавать новые объекты на основе старых данных. По какой-то причине простое изменение свойств не работает.

+0

Привет, можете ли вы сделать JS Fiddle для решения проблемы. Я застрял в одной и той же вещи –

+0

@PrateekRathore JS Fiddle не поможет, это конкретная проблема React Native, и вы не можете запустить родную среду на js скрипке. В чем конкретно проблема? Решение здесь было довольно простым в любом случае, вам просто нужно скопировать старый источник данных в совершенно новый объект, прежде чем дать его 'cloneWithRows' – AllTheTime

+0

Спасибо, ваши решения кажутся жизнеспособными. Сначала попробуй. –