ListView rowHasChanged r1始终等于r2

时间:2016-08-17 15:37:17

标签: react-native realm

我正在使用Realm Native的ListView,根据他们的网站,它基于React的ListView API。我也在关注Realm的ListView示例here

我的问题如下:我目前有一个ListView,在某些时候需要部分重新渲染,例如第X行需要更新。但是,功能:

rowHasChanged: function(r1, r2) {
    return +r1.date !== +r2.date;
}

...将始终返回false,这意味着我的ListView保持不变。

代码(在我的组件构造函数中)如下:

let objects = realm.objects('xxxx');

let dataSource = new ListView.DataSource({
   rowHasChanged: function(r1, r2) {
      return +r1.date !== +r2.date;
   }
});

this.state = {
   objects: objects,
   dataSource: dataSource.cloneWithRows(objects)
};

我还有一个更新函数,它将更新dataSource状态:

updateObject(id, date) {
    let obj = getObjById(id);

    realm.write(() => {
       obj[0].date = date;
       ...
    });
}

执行上述功能后,rowHasChanged将会触发。但是,r1r2相同,因此它们都包含新日期。这意味着我的ListView没有被重新呈现,并且有问题的行将包含不正确的(旧)日期。

1 个答案:

答案 0 :(得分:0)

我目前正在使用它作为临时解决方案,因为我们现在正在添加额外的n * 2计算。

我添加了一个名为copyArray的新功能(.slice(0)因其shallow copying而无法正常工作。)

我的组件中的构造函数:

let objects = this.copyArray(realm.objects('xxxx'));

let dataSource = new ListView.DataSource({
   rowHasChanged: function(r1, r2) {
      return +r1.date !== +r2.date;
   }
});

this.state = {
   objects: objects,
   dataSource: dataSource.cloneWithRows(objects)
};

新功能:

copyArray(array) {
    let newArray = [];

    for(let i = 0; i < array.length; i++) {
        newArray.push({
            date: array[i].date,
            ...
        });
    }

    return newArray;

}

更新功能:

updateObject(id, date) {
    let obj = getObjById(id);

    realm.write(() => {
       obj[0].date = date;
       ...
    });

    var newArray = this.copyArray(realm.objects('xxxx'));

    this.setState({
        objects: newArray,
        dataSource: this.state.dataSource.cloneWithRows(newArray)
   });
}