
CCVirtualGridList是基于Cocos Creator ScrollView + Layout 编写的一个具有 虚拟布局特点 的滚动列表控制容器。支持平滑滚动显示大量数据对象,元素可以实现 异步按帧加载 , 保证滚动平滑 。 具有滚动翻页功能 , 自适应宽度显示多列 , 单项选择 , 局部更新 等实用功能。
Cocos Creator 引擎中提供了一个常规的滚动控制容器——ScrollView,实现基本滚动控制。但是缺少与之配合的List控件来实现虚拟布局功能,需要开发者手动扩展,在这里就提供一个实现虚拟布局功能的扩展列表控件,是参照Egret中的List控件的接口方式来实现。
虚拟布局的原理其实很简单,就是只加载和显示可视区域的列表内容,可视区域外的并没有实体控件被实例化。以滚动事件驱动,动态滚动并复用可视区域内的列表模板,切换数据显示,看上去像一个完整的列表在上下滚动,由于此种设计实例化控件少,所以内存占用极少,drawcall数量低而且稳定,所以现在被普遍应用。但是虚拟布局的核心不仅在于此,由于需要不停地切换显示内容,如何将素材转换的更快速,更平滑才是虚拟列表的关键。CCVirtualGridList在VirtualGridListBaseItem 中提供自己的加载的方法——loadImage,实现异步按帧加载,保证列表滚动流畅度,又能有效利用缓存。
使用控件非常简单,只需要拷贝demo项目中三个文件VirtualGridListprefab,VirtualGridListjs,VirtualGridListBaseItemjs 到您的工程中Prefabs文件夹中即可。使用之前将VirtualGridListprefab拖入画面中, 列表单元控制组件继承 VirtualGridListBaseItem 就可以。
启动参数可以在creator 图形化界面填入,但是为了不受预制体的维护影响,建议通过初 始化脚本接口传入启动参数。
首次创建显示列表, dataList为数据数组
追加显示列表, dataList为追加的数据数组,适用于滚动翻页
获取数据数组
获取显示对象列表
清空列表
根据数据对象查找对应的显示对象,当开启虚拟列表的时候,返回对象可能不存在
获取缓存
注册滚动至底部回调方法 当useVirtualList=false 时不可用
修改数据后,刷新列表显示,some代表指定刷新的对象, 不传则刷新全部。
判断是否滚动至顶部
滚动至顶部
滚动到固定位置 itemIndex代表滚动至指定显示对象的索引, sec为滚动动画时长
数据对象。来自要显示的数据列表中的一条,每一条显示单元控件,都对应一条数据对象,当useVirtualLayout= true 的时候,单元控件对应的data数据对象不固定,会滚动切换。
子类可覆盖方法,自定义显示方法,当滚动交替或初始化的时候触发。当useVirtualLayout= true 的时候,每一个显示单元控件都是滚动复用的,所以对应的Component组件也是复用的,所以不要在其内部记录与某一条数据对应的变量或属性。
获取现实对象在队列中的索引
子类可覆盖方法,点选触发事件,只支持单选
子类可覆盖方法,如果当前为选中状态,当其他单元被点选触发此事件
子类可覆盖方法,当控件滑动离开可视区的时候触发 当useVirtualList=false 时不可用
子类可覆盖方法,当控件滑动进入可视区的时候触发 当useVirtualList=false 时不可用
VirtualGridList 提供的异步加载, 自动缓存。pic: 地址, cb: 加载后的回调方法,thisObj: 回调方法this对象
我帮你写了一段代码,你试试
// dg = dataGridvar index = dgSelectedIndex;
if (index == -1) // 判断是否选中了某一行
{
if (dgSelectedCellsCount > 0)
{
// 获取综合信息,包括行、列索引
// DataGridRow 对象
// DataGridCell 数据模板中的首元素
// 获取绑定到 DataGridRow 上的数据对象
var infos = dgSelectedCellsSelect(s => new
{
ColumnIndex = sColumnDisplayIndex,
RowIndex = dgItemsIndexOf(sItem),
DataItem = sItem, // 该行所绑定的数据对象
// 根据 sItem 获取 DataGridRow
DataGridRow = dgItemContainerGeneratorContainerFromItem(sItem),
// 根据 sItem 获取单元格模板的首个元素
VisulRoot = sColumnGetCellContent(sItem),
});
foreach (var info in infos)
{
ConsoleWriteLine("{0}: ({1},{2})",
infoVisulRoot, infoRowIndex, infoColumnIndex);
}
}
// 获取 DataGridRow 绑定的数据对象
var items = dgSelectedCellsSelect(s => sItem)Distinct();
}
else
{
/ SelectedIndex != -1 /
}
我就直接写获取tr了
var oTrs = documentgetElementsByTagName("tr");
for(var i=0,i<oTrslength;i++)
{
oTrs[i]index = i; //这里把每个tr的index属性里存入对应的i,以便后边取用
oTrs[i]onclick = function()
{
alert(thisindex); //你点击每TR就会d出他的索引值,是通过对应TR的index属性得到的
}
}
补充:
其实还有很多方法,比如闭包、new Function()等等。主要是看你习惯用哪个。
以上讲的查找方法基于比较的,查找效率依赖比较次数,其实理想的查找希望不经比较,一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,这样查找k时,只要根据这个对应关系f找到给定值k的像f(k)。这种对应关系f叫哈希(hash)函数。按这种思想建立的表叫哈希表(也叫散列表)。哈希表存取方便但存储时容易冲突(collision):即不同的关键字可以对应同一哈希地址。如何确定哈希函数和解决冲突是关键。
1哈希函数的构造方法
直接定址法:H(k)=k 或H(k)=ak+b(线形函数)
如:人口数字统计表
地址 1 2 3 100
年龄 1 2 3 100
人数 67 3533 244 4
数字分析法:取关键字的若干数位组成哈希地址
如:关键字如下:若哈希表长为100则可取中间两位10进制数作为哈希地址。
81346532 81372242 81387422 81301367 81322817 81338967 81354157 81368537
平方取中法:关键字平方后取中间几位数组成哈希地址
折叠法:将关键数字分割成位数相同的几部分(最后一部分的位数可以不同)然后取几部分的叠加和(舍去进位)作为哈希地址。
除留余数法:取关键字被某个不大于表长m的数p除后所得的余数为哈希地址。
H(k)=k mod p p<=m
随机数法:H(k)=rondom(k)。
2处理冲突的方法
假设地址集为0n-1,由关键字得到的哈希地址为j(0<=j<=n-1)的位置已存有记录,处理冲突就是为该关键字的记录找到另一个"空"的哈希地址。在处理中可能得到一个地址序列Hi i=1,2,k
0<=Hi<=n-1),即在处理冲突时若得到的另一个哈希地址H1仍发生冲突,再求下一地址H2,若仍冲突,再求H3。怎样得到Hi呢?
开放定址法:Hi=(H(k)+di) mod m (H(k)为哈希函数;m为哈希表长;di为增量序列)
当di=1,2,3, m-1 时叫线性探测再散列。
当di=12,-12,22,-22,32,-32,,k2,-k2时叫二次探测再散列。
当di=random(m)时叫伪随机探测序列。
例:长度为11的哈希表关键字分别为17,60,29,哈希函数为H(k)=k mod 11,第四个记录的关键字为38,分别按上述方法添入哈希表的地址为8,4,3(随机数=9)。
再哈希法:Hi=RHi(key) i=1,2,,k,其中RHi均为不同的哈希函数。
链地址法:这种方法很象基数排序,相同的地址的关键字值均链入对应的链表中。
建立公益区法:另设一个溢出表,不管得到的哈希地址如何,一旦发生冲突,都填入溢出表。
3哈希表的查找
例:如下一组关键字按哈希函数H(k)=k mod 13和线性探测处理冲突所得的哈希表a[015]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
14 01 68 27 55 19 20 84 79 23 11 10
当给定值k=84,则首先和a[6]比在依次和a[7],a[8]比结果a[8]=84查找成功。
当给定值k=38,则首先和a[12]比,再和a[13]比,由于a[13]没有,查找不成功,表中不存在关键字等于38的记录。
55 查找第k小元素
查找第k小元素即在n个元素中(未排序)找到第k小的元素。方法同快速排序,采用递归方式。
程序如下:
program kspv;
const n=7;
type
arr=array[1n] of integer;
var
b:arr;
i,k:integer;
function p(s,t:integer):integer;
var i,j,t1,x:integer;
begin
i:=s;j:=t;x:=b[i];
repeat
while (b[j]>=x) and (j>i) do j:=j-1;
if j>i then begin t1:=b[i]; b[i]:=b[j];b[j]:=t1;end;
while (b[i]<=x) and (i<j) do i:=i+1;
if i<j then begin t1:=b[j];b[j]:=b[i];b[i]:=t1; end
until i=j;
b[i]:=x;
p:=i;
end;
function find(s,t,k:integer):integer;
var p1,q:integer;
begin
if s=t then find:=b[s] else
begin
p1:=p(s,t);
q:=p1-s+1;
if k<=q then find:=find(s,p1,k) else find:=find(p1+1,t,k-q);
end;
end;
begin
write('input data:');
for i:=1 to n do read(b[i]);readln;
write('input k:');read(k);
write('output data:');
writeln('kthsmall:=',find(1,n,k));
end
希望你运用成功
以上就是关于CCVirtualGridList - Cocos Creator 虚拟列表全部的内容,包括:CCVirtualGridList - Cocos Creator 虚拟列表、WPF DataGrid 没有行的概念吗怎么能拿到选中行的索引 DataGrid.SelectedIndex 返回的值是-1,要怎么拿、javascript中如何表格返回该行的索引等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)