[UI列表]LoopScrollRect无限滑动不卡顿

简介:

应用场景

对于背包界面,排行榜列表,聊天消息,等有大量的UI列表的界面,常规做法是为每一条数据生成一个格子,在数据量越大的情况下,会生成越来越多的Gameobject,引起卡顿。

这篇文章讲述的就是解决UI列表卡顿的方法,在列表中只生成指定数量的Gameobject,滑动时进行数据更新,保证性能。

LoopScrollRect(无限滑动不卡顿)

插件地址:https://github.com/qiankanglai/LoopScrollRect

中文文档:http://qiankanglai.me/2015/08/15/LoopScrollRect/

适用于UGUI,支持UGUI原生的GridLayout,ScrollBar

我的修改版本:https://github.com/zhaoqingqing/LoopScrollRect.git

原理分析

在UGUI的ScrollRect基础上作的修改

两者的差异部分使用//==========LoopScrollRect==========标识出来了,源代码对比:

UGUI的ScrollRect:https://bitbucket.org/Unity-Technologies/ui/src/5.2/UnityEngine.UI/UI/Core/ScrollRect.cs?fileviewer=file-view-default

LoopScrollRect:https://github.com/qiankanglai/LoopScrollRect/blob/master/Assets/Scripts/LoopScrollRect.cs

使用示例

可以参考demo的示例

如果在lua中使用,逻辑和C#的一样,步骤如下:

1.注册事件、取消注册

2.在刷新函数根据数据更新列表

3.调用逻辑

注册事件

注册列表滑动事件,在OnInit中注册一次,用来刷新列表

此事件在C#中触发,Lua中注册回调,事件有两个参数

  self.chatScrollRect.dataSource:ScrollToTextEvent("+", handler(self, UIChat.OnScrollChat, self, cellTrans, idx))

取消注册

取消注册的列表滑动事件,在OnClose中取消

  self.chatScrollRect.dataSource:ScrollToTextEvent("-", UIChat.OnScrollChat)

触发滑动事件(刷新每一项)

在以下情况事件会被触发:

  1. 如果列表的值已全部生成出来,在滑动过程中不会触发,否则会触发
  2. 调用RefreshCells或RefillCellsFromEnd时,会触发
function UIRewardResources:OnScrollEvent(cellTrans, idx)
    if (not cellTrans or not idx) then
        return
    end
    idx = idx + 1 -- Lua的索引从1开始,而scrollRect是从0开始
    local data = DataCenter.resource.data[idx]
    --执行你的刷新逻辑
    self:DoRenderItem(cellTrans, data)
end

手动刷新列表

--设置列表的总数,并刷新cell
self.scrollRect.itemTypeStart = 0 ---让列表从头开始滑动
self.chatScrollRect.totalCount = 10
self.chatScrollRect:RefreshCells()

刷新并让列表滑动到底部

self.chatScrollRect:RefillCellsFromEnd()

两个刷新函数区别

RefreshCells:列表刷新

RefillCellsFromEnd:从最底部的消息开始刷新,并滑动到底部

列表滑动到底部的事件

和UGUI的ScrollRect的做法一样,为scrollRect添加一个scrollbar,捕捉OnEndDrag事件,示例如下:

    self.chatScrollRect.onEndDrag = function(data)
        if self.chatScrollbar.value >= 1 then
            print("scroll to bottom")
        end
    end

如果你的数据量特别大,在滑动到底部事件时进行分页请求数据

如果是做分页:建议在滑动到某个数量级且滑动到底部时,设置一次数据,保证滑动的流畅性

prefabSource为nil

如果在热更新的包中报prefabSource为nil,是因为热更新dll之后,prefabSource会丢失,需要在lua对prefabSource重新赋值,示例:

self.scrollRect.prefabSource = CS.UnityEngine.UI.XLoopScrollPrefabSource(self.itemCell.gameObject)

技巧和事项

Cell指:每一个格子,或每一项列表

为每一个Cell都绑定LayoutElement组件,并勾选Preferred Width 和Preferred Height,且给它们赋合适值,保证列表自适应。

跳转到指定的index/Item:https://github.com/qiankanglai/LoopScrollRect/issues/14

不绑定initInStart脚本,并调用 RefillCells(90)

查找某一项的取巧做法:可以用id做为Cell的名字,当在查找时,根据FindChild(id)找到这一项,进行刷新。



本文出自赵青青,原文链接:http://www.cnblogs.com/zhaoqingqing/,如需转载请自行联系原作者

相关文章
|
JavaScript
Vue Antdv 列表(table、list)自定义空数据状态UI
Vue Antdv 列表(table、list)自定义空数据状态UI
684 0
|
28天前
|
UED
「Mac畅玩鸿蒙与硬件28」UI互动应用篇5 - 滑动选择器实现
本篇将带你实现一个滑动选择器应用,用户可以通过滑动条选择不同的数值,并实时查看选定的值和提示。这是一个学习如何使用 Slider 组件、状态管理和动态文本更新的良好实践。
42 1
|
4月前
|
JavaScript 前端开发
Vue实现Element UI框架的自定义输入框或下拉框在输入时对列表选项进行过滤,以及右键列表选项弹出菜单进行删除
本文介绍了如何在Vue框架结合Element UI库实现自定义输入框或下拉框,在输入时对列表选项进行过滤,并支持右键点击列表选项弹出菜单进行删除的功能。
105 0
|
小程序 NoSQL Redis
【uniapp小程序】打印列表UI模板
【uniapp小程序】打印列表UI模板
116 0
|
前端开发
前端项目实战玖拾陆react-admin+material ui-踩坑-List的用法之Empty来设置空列表
前端项目实战玖拾陆react-admin+material ui-踩坑-List的用法之Empty来设置空列表
84 0
|
前端开发
前端项目实战叁拾肆-​react-admin+material ui-单表订单列表新增
前端项目实战叁拾肆-​react-admin+material ui-单表订单列表新增
71 0
|
前端开发
前端项目实战叁拾伍-​react-admin+material ui-单表订单列表编辑
前端项目实战叁拾伍-​react-admin+material ui-单表订单列表编辑
72 0
|
前端开发
前端项目实战叁拾叁-​react-admin+material ui-单表订单列表
前端项目实战叁拾叁-​react-admin+material ui-单表订单列表
68 0
|
前端开发
前端项目实战贰拾陆-​react-admin+material ui列表页
前端项目实战贰拾陆-​react-admin+material ui列表页
65 0
Taro + Taro UI实现列表下拉刷新,无限滚动 #106
Taro + Taro UI实现列表下拉刷新,无限滚动 #106
1094 0