重新加载ListView无法正常工作

重新加载ListView无法正常工作,listview,datasource,ecmascript-6,react-native,Listview,Datasource,Ecmascript 6,React Native,重新表述我的问题。。。(使用单独的类别进行测试) 我正试图在按下按钮时使用随机数组重新加载listview。但它不起作用!正在尝试使用以下LOC刷新数据源: _buttonPressed() { this.setState({ dataSource: this.state.dataSource.cloneWithRows(this._randomArray()), }); } _randomArray() { var j

重新表述我的问题。。。(使用单独的类别进行测试)

我正试图在按下按钮时使用随机数组重新加载
listview
。但它不起作用!正在尝试使用以下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;
}


我已经看到了
React-Native
的listview项目示例。为此,他们正在使用
dataSource.cloneWithRows
。不知道我错过了什么小东西。请帮我解决这个问题。。。谢谢

我已成功调试了该问题。我刚刚打开了
ListViewDataSource.js
的源代码,并跟踪了通过不同函数传递的
datablob
变量值

方法
\u calculateDirtyArray
标识哪些行已更改,需要更新。为此,一行的三个条件之一必须匹配

 ........
    // 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);
 ........
\u rowHasChanged
是传递给
列表数据源的构造函数

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"])
                );
            }
        });
瞧!它现在工作得很好。希望它能帮助将来的人