1. ListView dataSource

介绍:

ListView需要指定数据的来源。传入数据必须是数组,或者是字典里面嵌套数组

系统会根据你传入的数据自动生成section和row

每一个字典的key会被ListView拆分成一个section(小节,这里的section和原生的一样),如果你不指定sectionId,则key就是sectionId

如何使用。

在构造函数中指定ListView的取值策略,先new一个dataSource对象

constructor(props) {

super(props);

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

}

rowHasChanged 可以是以下几种

1.getRowData(dataBlob, sectionID, rowID):表明我们将以何种方式从dataBlob(数据源)中提取出rowData,sectionID用于指定每一个section的标题名(在renderRow,renderHeader等方法中会默认拆开并作为参数传入)

2.getSectionHeaderData(dataBlob, sectionID):表明我们将以何种方式从dataBlob(数据源)中提取出HeaderData。HeaderData用于给每一个sectionHeader赋值

3.rowHasChanged(prevRowData, nextRowData):指定我们更新row的策略,一般来说都是prevRowData和nextRowData不相等时更新row

4.sectionHeaderHasChanged(prevSectionData, nextSectionData):指定我们更新sectionHeader的策略,一般如果用到sectionData的时候才指定

默认数据的提取策略

{ sectionID_1: { rowID_1: rowData1, ... }, ... }

或者:

==**{ sectionID_1: [ rowData1, rowData2, ... ], ... }**==

或者:

[ [ rowData1, rowData2, ... ], ... ]

作者:sidiWang
链接:https://www.jianshu.com/p/1293bb8ac969
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

大多数情况下我们会用到第二种(字典套数组)和第三种(纯数组),每一个数组对应的key系统会自动提取成sectionId。然后我们可以根据sectionId来判断所加载的section

为dataSource传递数据


cloneWithRows(dataBlob, rowIdentities)

dataBlob是原始数据源。在没有section的时候使用此方法

,传入一个数组。rowIdentities为可选类型,为数据源的每一项指明一个id

。默认的id为字符串'0','1','2'...dataBlob.count

cloneWithRowsAndSections(dataBlob, sectionIdentities, rowIdentities)

字典套数组的结构(有section),我们使用下面的方法为数据源赋值。sectionIdentities和rowIdentities都是可选类型

例子1-最简单的ListView实现。

//1。构造函数中声明
/*第一步我们创建了DataSource对象,提供了row更新的策略。
然后我们在初始化state的时候,初始化一个dataSource和一个data属性
*/
constructor(props) {
super(props);
var ds=new ListView.DataSource({rowHasChanged:(r1,r2)=>r1!=r2})
this.state={
dataSource:ds,
data:["h","h","h","h","h"]
}
}
//行方法
_renderRow(rowData,rowId)
{
return (
<Text>{rowData+''+rowId}</Text>
)
} //listview 的使用。
/*
调用了dataSource对象提供的cloneWithRows方法给ListView的dataSource赋值,
并传入了数据源data。然后在renderRow方法中返回一个Text控件,将每一行的内容和rowId打印出来。
*/
<ListView
dataSource={this.state.dataSource.cloneWithRows(this.state.data)}>
renderRow={(rowData,sectionId,rowId)=>this._renderRow(rowData,rowId)} </ListView>

例子2-实现一个带有section的ListView。

RN会根据你传入的数据源判断是否含有section,并调用cloneWithRowsAndSections把数据源传给ListView。如果你不指定sectionId,则RN会默认按之前提到过的数据结构取出相应的sectionId和rowId

注意,如果使用cloneWithRowsAndSections传入数据源,必须在构造方法里面传入sectionHeaderHasChanged方法

constructor(props) {
super(props);
var ds=new ListView.DataSource({
rowHasChanged:(r1,r2)=>r1!=r2,
sectionHeaderHasChanged:(s1,s2)=>s1!=s2
})
this.state={
dataSource:ds,
data:{a:['h','m'],b:['h1','m1'],c:['h2','m2']}
}
} // section 是a, rowid 是0开头, rowdata是h,m _renderRow(rowData,rowId,sectionId)
{
return (
<Text>{rowData+''+rowId+''+sectionId}</Text>
)
} <ListView
dataSource={this.state.dataSource.cloneWithRowsAndSections(this.state.data)}>
renderRow={(rowData,sectionId,rowId)=>this._renderRow(rowData,rowId,sectionId)}
</ListView>

RN中关于ListView的使用的更多相关文章

  1. 解决在ScrollView中套用ListView显示不正常

    最近在设计Android程序时,因为需要在ScrollView中添加一个ListView列表来显示一些信息.刚开始并没有想太多,但添加进去后才发现ListView不论怎样定义都只能显示一行,显示效果很 ...

  2. ScorllView中嵌套listView与Viewpager的焦点问题处理

    解决进入该页面直接显示中的listview而不是从页面最顶端开始显示在setAdapter后调用listview的smoothScrollTo(0,20); 解决listview只能显示一条 需要重写 ...

  3. “Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置

    这个扩展属性从WP8.1就开始用了,主要是为了解决MVVM模式中无法直接控制ListView滚动位置的问题.比如在VM中刷新了数据,需要将View中的ListView滚动到顶部,ListView只有一 ...

  4. 在Activity中响应ListView内部按钮的点击事件

    最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在Adapter中响应? 对于这个问题,我最初给他的解答是,在Adapter中定义一个回调接口,在A ...

  5. Xamarin.Forms中的ListView的ItemTrapped事件与ItemSelected事件的区别

    今天对Xamarin.Forms中的ListView的两个事件(ItemTrapped和ItemSelected)做了小小的研究,发现有以下几点区别: 1.ItemTrapped事件会优先被触发. 2 ...

  6. C#中使用ListView动态添加数据不闪烁并显示当前插入值

    首先,自定义一个类ListViewNF,继承自 System.Windows.Forms.ListView class ListViewNF : System.Windows.Forms.ListVi ...

  7. 实现ScrollView中包含ListView,动态设置ListView的高度

    ScrollView 中包含 ListView 的问题 : ScrollView和ListView会冲突,会导致ListView显示不全 <?xml version="1.0" ...

  8. 关于ScrollView中嵌套listview焦点滑动问题 解决

    (第三种,第四种简单推荐使用) 在这里我要提出的是,listview能滚动的前提是:当listview本身的高度小于listview里的子view. 第一种方法 只需在MainActivity中 找到 ...

  9. Activity中与ListActivity中使用listview区别

    Activity中与ListActivity中使用listview区别 一.Activity中与ListActivity中使用listview区别(本身没多大区别,只是ListActivity在lis ...

随机推荐

  1. 【Spring学习笔记-MVC-15】Spring MVC之异常处理

    作者:ssslinppp       1. 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理 ...

  2. DNS 解释 --- 解析域名给电脑,电脑只看得懂1.1.1.1.1 这些ip地址 所以要翻译给他

    把域名翻译成IP地址的软件称为域名系统,即DNS 当网络上的一台客户机需要访问某服务器上的资源时,客户机的用户只需要在浏览器中的地址文本框中输入该服务器的网址.就可以与该服务器进行连接,计算机的硬件只 ...

  3. appium 3-31626 toast识别

    1.toast弹窗,普通方式不能获取 例如使用getPageSource是无法找到toast的信息,uiautomatorViewer加载页面时间较长,也很难采集到toast信息 2.通过curl命令 ...

  4. 关于UC、火狐、谷歌浏览器屏蔽布局中广告的解决办法

     关于UC浏览器屏蔽了广西人才网的名企.品牌.热点的logo,是因为当成广告过滤掉了,以后div的class和id不能以“ad”开头.这可能只是其中一个规则,adxxxx是可以的,不能是adXxxx, ...

  5. Windows下python 安装Mysqldb模块

    CMD执行 pip install mysql-python 报错如下: 1.如果报类似 Microsoft Visual C++ 9.0 is required < Unable to fin ...

  6. Install hadoop on windows(non-virtual machine, such cygwin)

    DownloadBefore starting make sure you have this two softwares Hadoop 2.7.1 Java – Jdk 1.7+ Extract d ...

  7. ESB初步配置文件认识

    每个项目的都有各自的场景,但是其实往小处说,场景的处理基本都是很相似,之前做copy文件的程序,其实就是一种很常见的ETL的过程(转移文件,异构系统通过文件系统交换数据,存在数据同步). 了解一下ET ...

  8. AFNetworkingErrorDomain 错误解决方法

    首先我们来看一下错误信息: Error Domain=AFNetworkingErrorDomain Code=-1011 "Expected status code in (200-299 ...

  9. 基于Linux的Samba开源共享解决方案测试(二)

    单NAS网关50Mb码率视音频文件的稳定读测试结果如下: 50Mb/s负载性能记录 NAS网关资源占用 稳定读 稳定读 CPU空闲 内存空闲 网卡占用 13个稳定流 96.70% 10G 104MB/ ...

  10. url的命名与反向解析

    url命名和反向解析  1. 命名   # url(r'^press_list/$', views.press_list,name='press_list'),     url(r'^pre/$', ...