в listView renderRow не вызывается после установки состояния

В представлении списка при нажатии на данные списка в renderRow отображается галочка, я написал так

constructor(props){
    super(props);
    var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
    this.state={
     dataSource: ds.cloneWithRows(['row 1', 'row 2'])
    }
  }
 componentDidMount(){
   //After getting data from service i am setting data to the dataSource
 this.setState({ dataSource: ds.cloneWithRows(responseData.data.listTeamBySportId) })
 }

    onTeam(rowData,rowID){
        if(this.state.opacity == rowID){
          this.setState({opacity:null})
        }else{
          this.setState({opacity:rowID})
        }
      }
    render(){
     <ListView
                       style={{flex:1}}
                      dataSource={this.state.dataSource}
                      renderRow={this.renderData.bind(this)}  
                      renderSeparator={(sectionID, rowID) => <View key=       {`${sectionID}-${rowID}`} style={styles.separator} />}
                      automaticallyAdjustContentInsets={false}/>
    }
    renderData(rowData,sectionID:number,rowID:number){
            return (
              <View style={styles.subBody}>
                <TouchableHighlight onPress={this.onTeam.bind(this,rowData,rowID)}>
                  <View  style={{backgroundColor:rowData.colorCode,height:44,flexDirection:'row'}}>
                     <View style={styles.centersubBody}>
                        <Text style={{color:'white',fontWeight:'bold',fontSize:17,fontFamily:'Roboto-Medium',marginLeft:10}}>{rowData.location}</Text> 
                     </View>
                    <View style={styles.rightsubBody}>
                        {this.state.opacity == parseInt(rowID) ? (
                        <Image style={{marginRight:5,marginTop:5, width:25, height:25, marginBottom:10}} source={require('image!selected')}/>
                        ):<View></View>}
                   </View>
                  </View>
                </TouchableHighlight>
              </View>
        );
       } 

Моя реактивная версия: 0.51.0 Здесь проблема заключается в том, что когда данные составляют до 10 записей, мой код работает после setState в функции OnTeam, он снова отображается в renderRow() и показывает галочку, но проблема в том, что когда данных больше 10 записей, они не попадают в данные renderRow. Пожалуйста, дайте мне предложения, как решить эту проблему, любая помощь очень ценится


person Hussian Shaik    schedule 21.07.2016    source источник
comment
Я столкнулся с той же проблемой, и мой код такой же, как у вас. У вас есть решения? тогда, пожалуйста, поделитесь со мной. Спасибо   -  person KAUSHAL J. SATHWARA    schedule 06.07.2018
comment
Здравствуйте, у вас есть решение?   -  person KAUSHAL J. SATHWARA    schedule 09.07.2018


Ответы (2)


Если вы хотите, чтобы список был перерисован, вам нужно изменить данные в состоянии. В конструкторе компонента определите переменную this.ds, которая содержит объект источника данных, и поместите в состояние переменную, которую вы будете использовать для данных списка. . Например, инициал

this.state ={
myDs: this.ds.cloneWithRows([])
} 

И когда вы хотите перерендерить с новыми данными, напишите

this.setState({myDs: this.ds.clone...(arrNewData)};

Уопа, ты понял идею

person matan    schedule 23.07.2016
comment
я уже сделал это, пожалуйста, посмотрите приведенный выше код, который я обновил - person Hussian Shaik; 25.07.2016

насколько я знаю, компонент listView особенный. есть API для listView.dataSource.

var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.state = {
  dataSource: ds.cloneWithRows(['row 1', 'row 2']),
};

на мой взгляд, если не использовать ds.cloneWithRows, данные не меняются

person Stephen Kingsley    schedule 22.07.2016
comment
this.setState({источник данных: ds.cloneWithRows(responseData.data.listTeamBySportId)}); когда я писал так после извлечения данных, данные не отображаются в listView, могу ли я узнать причину - person Hussian Shaik; 22.07.2016
comment
не могли бы вы ответить - person Hussian Shaik; 22.07.2016
comment
Пожалуйста, ответьте за это - person Hussian Shaik; 22.07.2016
comment
можешь показать мне свой код? this.setState({ dataSource: ds.cloneWithRows(responseData.data.listTeamBySportId) });, не вижу никакой проблемы. - person Stephen Kingsley; 24.07.2016
comment
Привет, я изменил свой код выше, пожалуйста, просмотрите его и дайте мне знать, есть ли проблема с моим кодом - person Hussian Shaik; 25.07.2016
comment
у вас есть возможность проверить мой код, который я обновил выше? - person Hussian Shaik; 26.07.2016
comment
извините, на прошлой неделе у меня не было времени. сейчас регистрируюсь. и думаю проблема в функции onTeam. вы вызываете функцию onTeam для изменения ListView, но ListView изменится, потому что изменился источник данных. Данные ListView используют только ds.cloneWithRows(['row 1', 'row 2']) для установки. В вашей функции onTeam вы использовали `this.setState({opacity:null})`, что я думаю неправильный. - person Stephen Kingsley; 27.07.2016
comment
У меня такая же проблема, у вас есть решение? - person KAUSHAL J. SATHWARA; 10.07.2018
comment
@KAUSHALJ.SATHWARA Какая проблема? Можешь попробовать мое решение? - person Stephen Kingsley; 12.07.2018