2015-05-06 2 views
5

Re-Перефразируя мой вопрос ... (протестирован с отдельным классом)Reload ListView не работает Реагировать Native

Я пытаюсь перезагрузить listview со случайным массивом на кнопках. Но это не работает! Попытка сделать обновление datasource это с следующим LOC:

_buttonPressed() { 
     this.setState({ 
      dataSource: this.state.dataSource.cloneWithRows(this._randomArray()), 
     }); 
    } 

_randomArray() { 

    var jsonRes; 

    switch(this.getRandomInt()) // number returned is valid. I checked 
    { 
     case 1: 
     { 
      jsonRes = '[' + 
      '{ "firstName":"Michel" , "lastName":"John" ,"age":18},' + 
      '{ "firstName":"Richard" , "lastName":"Joe","age":20 },' + 
      '{ "firstName":"James" , "lastName":"Henry","age":15 },' + 
      '{ "firstName":"e" , "lastName":"u","age":15 }]'; 
      break; 
     } 
     case 2: 
     { 
      jsonRes = '[' + 
      '{ "firstName":"bacde" , "lastName":"John" ,"age":18},' + 
      '{ "firstName":"bacde" , "lastName":"Joe","age":20 },' + 
      '{ "firstName":"bacde" , "lastName":"Henry","age":15 },' + 
      '{ "firstName":"ebacde" , "lastName":"u","age":15 }]'; 
      break; 
     } 
     case 3: 
     { 
      jsonRes = '[' + 
      '{ "firstName":"mmmmm" , "lastName":"John" ,"age":18},' + 
      '{ "firstName":"mmmmm" , "lastName":"Joe","age":20 },' + 
      '{ "firstName":"mmmmm" , "lastName":"Henry","age":15 },' + 
      '{ "firstName":"etttttt" , "lastName":"u","age":15 }]'; 
      break; 
     } 
     default: 
     { 
      jsonRes = '[' + 
      '{ "firstName":"dddd" , "lastName":"John" ,"age":18},' + 
      '{ "firstName":"dddd" , "lastName":"Joe","age":20 },' + 
      '{ "firstName":"dddd" , "lastName":"Henry","age":15 },' + 
      '{ "firstName":"ehhgh" , "lastName":"u","age":15 }]'; 
      break; 
     } 
    } 

    var myObject = eval('(' + jsonRes + ')'); 
    return myObject; 

}

Я уже видел пример ListView проекты React Native. Для этой цели они используют dataSource.cloneWithRows. Не знаю, какую маленькую вещь мне не хватает. Пожалуйста, помогите мне разобраться в этом вопросе ... Спасибо!

ответ

12

Я смог успешно отладить проблему. Я только что открыл исходный код для ListViewDataSource.js и проследил значение переменной datablob, переданное по различным функциям.

Метод _calculateDirtyArrays определяет, какие строки были изменены и их необходимо обновить. Для этого одно из трех условий должно соответствовать строке.

........ 
    // dirty if the section is new, row is new or _rowHasChanged is true 
    dirty = 
     !prevSectionsHash[sectionID] || 
     !prevRowsHash[sectionID][rowID] || 
     this._rowHasChanged(
     this._getRowData(prevDataBlob, sectionID, rowID), 
     this._getRowData(this._dataBlob, sectionID, rowID) 
    ); 
    this._dirtyRows[sIndex].push(!!dirty); 
........ 

_rowHasChanged является один передается List Datasource конструктор.

var dataSource = new ListView.DataSource(
{rowHasChanged: (r1, r2) => r1.guid !== r2.guid}); 

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

var dataSource = new ListView.DataSource(
     { 
      rowHasChanged: function(r1, r2) : bool { 
       return (
       (r1["firstName"] !== r2["firstName"]) || 
       (r1["lastName"] !== r2["lastName"]) || 
       (r1["age"] !== r2["age"]) 
       ); 
      } 
     }); 

и voila! Теперь он отлично работает. Надеюсь, это поможет кому-то в будущем!

+0

Вы - спасатель! –

+0

здесь, сохранен 2. – Suho

Смежные вопросы