列表容器删除重建,怎么操作可以不会到顶部
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-06-05 14:21:20 |
👁️ 阅读: 10
要实现列表容器删除重建后不回到顶部,关键在于保存当前滚动位置,重建后恢复。以下是具体操作步骤:
```lua
-- 1. 获取当前滚动位置
local currentPos = GUI:ListView_getInnerContainerPosition(listView)
SL:Print("当前滚动位置:", currentPos.x, currentPos.y)
-- 2. 删除所有子节点
GUI:ListView_removeAllItems(listView)
-- 3. 重建列表内容(这里以示例代码展示)
for i = 1, 10 do
local item = GUI:Widget_Create(nil, "item_"..i, 0, 0, 180, 30)
local text = GUI:Text_Create(item, "text", 10, 15, 14, "#ffffff", "项目"..i)
GUI:ListView_pushBackCustomItem(listView, item)
end
-- 4. 刷新布局并恢复位置(需要延迟执行确保布局完成)
local function restorePosition()
GUI:ListView_doLayout(listView)
-- 设置滚动位置到之前保存的位置
-- 注意:这里使用ScrollView的函数,因为列表容器继承自滚动容器
GUI:ScrollView_scrollToTopLeft(listView, 0, false)
-- 或者使用设置内部容器位置的方式
-- GUI:setPosition(GUI:getChildByName(listView, "innerContainer"), currentPos.x, currentPos.y)
end
-- 使用单次延迟确保布局完成
SL:ScheduleOnce(restorePosition, 0.1)
```
**关键点说明:**
1. `GUI:ListView_getInnerContainerPosition()` 获取当前滚动位置
2. 删除后重建内容
3. `GUI:ListView_doLayout()` 刷新布局
4. 使用 `SL:ScheduleOnce()` 延迟恢复位置,确保布局计算完成
5. 可以尝试使用 `GUI:ScrollView_scrollToTopLeft()` 快速定位
**注意事项:**
- 如果列表内容高度变化较大,恢复的位置可能不精确
- 建议使用 `GUI:ListView_jumpToItem()` 跳转到特定项目来保持视觉焦点
- 对于大量数据,考虑分批加载避免卡顿
如果还有不清楚的,随时问我!浮生梦老师的前端课程里也有详细讲解列表容器的使用技巧。
← 返回问答库