技术标签: ListVie Position Flutter 可见Item
Flutter给我们提供了丰富的控件和控制方法,但是也有不少问题,就这两天,我就遇到去获取ListView第一个可见Item的Position的问题,Flutter并没有提供方法,只能我们想办法,我记得有大佬说过ListView和Android的RecyleView一样,那ListView的ItemBuilder肯定是用多少创建多少,用哪个创建哪个,抱着试试的态度,我在ItemBuilder打印了一下,果然,他只创建当前要用的Item,下来我们看看我的思路
我们首先考虑初始化了多少个Item,这个信息对我们又什么用呢?? 这个数据我们缓存成Items的位置数组“positions”,(例如初始化Item数量为 5 ,表示初始化了0-5 Position 的 Item),初始化完成后,ListView滑动时,builder会根据需要创建新的Item,回收不用的Item。 builder每添加一个Item(前面说过,用一个添加一个,已经初始化好的Item,builder不在创建,即不再执行创建方法),我们就在初始化时缓存的位置变量“positions”的基础上改动,那Position 数组就可以自行调整头和尾了。
这样,我们就知道大概第一个可见Item就在数组变量“positions”的前几个,为什么说是前几个,而不是第一个,因为我们缓存的Position 包括 屏幕可见+缓存的,所以第一个并不一定时可见的。
好了,讲了那么多,那怎么去知道初始化了多少个Item??? 在初始化时 ,我们不确定到底会 初始创建 多少Item,数组变量也不好创建, 所以我们用一个整形变量“memoryPosition”去记录 初始化创建 多少Item,好了,我们现在知道Item数量了(包括 屏幕可见+缓存的)。 初始化Item的数量我们知道了。接下来 我们找个合适的时机将Item数量 Position 缓存成List数组—>“positions”,我是在NotificationListener的ScroStartNotification里面缓存Position的。 positions数组可以自行调整头和尾 那不就更简单了 ,看代码 ↓↓↓↓
注意:大家尽量把cacheEctent的值调小,缓存越小,后面获取position越快
List<int> positions;
int memoryPosition;
child: new ListView.builder(
cacheExtent: 30.0,
itemBuilder: (context, index) {
//根据positions==null来判断是否已经初始化
if(positions!=null) {
//已经初始化过的话 滑动自行调整头和尾
if (index > positions.last) {
positions.removeAt(0);
positions.add(index);
} else if (index < positions.first) {
positions.removeLast();
positions.insert(0, index);
}
}else{
//记录初始化了多少个Item
memoryPosition=index;
}
},),
NotificationListener的ScroStartNotification里面将变量memoryPosition 缓存成数组 positions,看代码
new NotificationListener(
onNotification: (notification){
if(notification is ScrollStartNotification){
if(positions==null) {
positions=new List();
for(int i=0 ;i<=memoryPosition;i++){
positions.add(i);
}
}
}
},
child: new ListView.builder(),
这样我们就知道头和尾了,并实时更新,可是头不一定是第一个可见Item,有可能是缓存的item,那我们怎么办呢,
我当时在想 我在调用时 如果我让 ListView在屏幕的位置 和 Item在屏幕中的位置+Item的高度 做比较 如果Item可见 ,那么Item在屏幕中的位置+Item的高度肯定大于ListView在屏幕的位置 (大家别忘了给ListView和它的Item们设置Key哟),好了,我们看代码
int firstChildPosition=positions.first;
int lastChildPosition=positions.last;
double chileGlobalPositionY;
double chileHeight;
//获取ListView在屏幕中的位置
double listViewGlobalPositionY=listViewKey.currentContext.findRenderObject().getTransformTo(null).getTranslation().y;
for(int i=firstChildPosition;i<=lastChildPosition;i++){
if(adsorptionDatas[i].adsorptionKey.currentContext==null){
continue;
}
//子控件在屏幕中的位置 用于计算第一个可见Item的位置
chileGlobalPositionY=adsorptionDatas[i].adsorptionKey.currentContext.findRenderObject().getTransformTo(null).getTranslation().y;
//控件高度 用于计算第一个可见Item的位置
chileHeight=adsorptionDatas[i].adsorptionKey.currentContext.findRenderObject().paintBounds.size.height;
//如果在屏幕中可见
if(chileGlobalPositionY+chileHeight>listViewGlobalPositionY){
//TODO i就是第一个可见Item的位置
break;
}
}
这样,我们的第一个可见Item的位置就获取到了
详细代码可参考https://github.com/baoolong/PullToRefresh 吸顶布局模块的代码
工作需要,万般无奈在网上查了好多资料 ,这导出到Excel的方法有很多,我看到了这个,加上了自己的一些修改,分享给大家,望大家多多的指正,并且希望你不吝共享你更好的方法哦,感激不尽。 1.封装要到处的数据类,这里使用Student类举例:package com.jeelon.exportExcle;public class Student { private in
简易北斗C/A码matlab仿真1.C/A码产生原理BD2B1 CA码产生原理框图如图所示,图中的方框可以通过移位寄存器来实现,模2加用异或来实现。从图下可见,码由两个线性序列G1 和G2 模二和产生平衡Gold 码后截短1 码片生成。G1 和G2 序列分别由两个11 级线性移位寄存器生成,其生成多项式为:G1(X)=1+X+X7+X8+X9+X10+X11(系数为代码中的S1)G2(X)=1+X+X2+X3+X4+X5 +X8+X9+X11(系数为代码中的S2)G1 和G2 的初始相位为:010
一,前言由于最近需要做一款企业内部使用的vueCodeBase,用做公司项目初始化脚手架常规的vue init template &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;project-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;脚手架不能满足需要因此希望能够实现一款定制化的基于template模板之上的脚手_vue-cli 本地自定义模板
java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.yml'
要使能选中命令行中的文字,首先修改一下设置:在命令行选中文字,右击即表示复制,到notepad++中ctrl+v粘贴。或者:在notepad++中ctrl+c复制,到命令行右击即可粘贴。总结:命令行下ctrl+c ctrl+v不表示复制 粘贴,两个操作都是鼠标右击。ctrl+c表示结束某一操作。..._cmd利用notepad复制镜像文件
matlab矩阵内元素检测函数名称函数功能isempty判断矩阵是否为空矩阵isscalar判断矩阵是否为标量isvector判断矩阵是否为向量issparse判断矩阵是否为向量isnumeric检测矩阵元素是否为数值型变量isreal检测矩阵元素是否为实属类型变量isfloat检测矩阵元素是否为浮点数变量isinteger检测矩阵元素是否为整数型变量islogical检测矩阵元素是否为逻辑性变量ischar检测_matlab判断矩阵为空
在处理Hibernate的实体查询,一般可以采用多种方式处理复杂的查询,必然要_hibernate in查询
public void backUpSms1(View view){XmlSerializer serializable=Xml.newSerializer();//创建xml序列化器File file=new File(Environment.getDataDirectory(),"backup1.xml");//指定文件保存的位
传送门首先如果一开始有一堆的石子数比其它所有堆的石子数的总和还要多,那么先手就可以一直从这个最多石子数的堆中取石子,最终一定会先手胜利。然后考虑普遍情况,假设不存在某一堆,使得这一堆石子数比其它堆石子数总和还要多,那么双方一定会避免在拿走某一堆的一颗石子后,突然出现一堆石子数大于其它堆的石子数之和,因为这样就会让对手有机可乘。假设现在的局面是某一堆石子与其他所有堆石子数量相等,那么当前的操作方一定会去从那一堆石子中拿走一颗石子,否则对手就会胜利,于是最终会剩下一颗石子,拿走最后一颗石子的会赢得胜利。._codeforces 每次可以合并两堆石子 博弈
POI版本3.14操作ppt的HSLF中没有找到操作图表的类。操作pptx的XSLF中有操作图表的类:org.apache.poi.xslf.usermodel.XSLFChart。ppt页面(XSLFSlide)没有找到创建一个图标的方法。尝试过从一个模板页读取一个chart元素,再通过slide.addRelation("sdf", XSLFRelation.CHART, xl
我阿里云的系统是Alibaba Cloud Linux 2.1903 LTS 64位,它是基于Centos7开发的,所以理论上能够安装支持Centos7的软件。但是却隐含了一个大坑原因:Alibaba Cloud Linux系统的releasever变量是“2.1903”,而不是Centos7的“7”,这导致了安装识别的系统版本不对,造成失败。所以解决方案很简单,将rpm安装包下载,强制安装,随后将对应yum.repos.d文件中的$releasever替换成数字7即可。1.下载rpm包wget _/var/tmp/yum-root-pyx4qa/pgdg-redhat-repo-latest.noarch.rpm: does not update
http://blog.csdn.net/catherine880619/article/details/6796561public void onItemClick(AdapterView parent, View view, int position, long id){view.findbyid(R.id.xxview);}_c++ 获取item下的控件