加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

重新加载ListView不工作React Native

发布时间:2020-12-15 05:04:46 所属栏目:百科 来源:网络整理
导读:重新措辞我的问题……(用单独的课程测试) 我试图在按下按钮时使用随机数组重新加载listview.但它不起作用!尝试使用以下LOC刷新数据源: _buttonPressed() { this.setState({ dataSource: this.state.dataSource.cloneWithRows(this._randomArray()),}); }_r
重新措辞我的问题……(用单独的课程测试)

我试图在按下按钮时使用随机数组重新加载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",' +
            '{ "firstName":"bacde",' +
            '{ "firstName":"ebacde","age":15 }]';
            break;
        }
        case 3:
        {
            jsonRes = '[' +
            '{ "firstName":"mmmmm",' +
            '{ "firstName":"mmmmm",' +
            '{ "firstName":"etttttt","age":15 }]';
            break;
        }
        default:
        {
            jsonRes = '[' +
            '{ "firstName":"dddd",' +
            '{ "firstName":"dddd",' +
            '{ "firstName":"ehhgh","age":15 }]';
            break;
        }
    }

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

}

我已经看过React Native的示例listview项目.他们正在使用dataSource.cloneWithRows来实现此目的.不知道我错过了什么小事.请帮我解决这个问题…谢谢!

我已经能够成功调试该问题.我刚刚打开了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,rowID)
      );
    this._dirtyRows[sIndex].push(!!dirty);
 ........

_rowHasChangedis传递给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"])
                );
            }
        });

瞧!它现在完美无缺.希望它将来有助于某人!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读