qiankanglai / LoopScrollRect

These scripts will make your UGUI ScrollRect reusing cells, to improve performance, loading time and draw calls.
http://qiankanglai.me/2015/08/15/LoopScrollRect/
MIT License
2.29k stars 475 forks source link

請求幫助,運作中新增資料該怎麼處理才能讓Scroll 位置維持之前觀看的位置呢? #108

Closed SyaoranChang closed 2 years ago

SyaoranChang commented 2 years ago

你好,

如果原先只有10筆資料,動態加了1筆資料 也是呼叫 RefillCells() 嗎? 目前呼叫 RefillCells() 後 Scroll 位置會歸0 要怎麼樣才能 拖曳到第5個時,動態增加資料後,Scroll 位置 還是在第5個的位置呢?

qiankanglai commented 2 years ago

哈喽,你可以拉一下最新的代码,然后利用RefreshCells这个接口即可。我本地测了下表现正常

if (Input.GetKeyDown(KeyCode.T))
{
    var scorll = GetComponent<LoopScrollRect>();
    scorll.totalCount = scorll.totalCount + 1;
    scorll.RefreshCells();
}
SyaoranChang commented 2 years ago

感謝更新 1.剛剛測試發現新增一筆資料並呼叫 RefreshCells()的情況 多試幾次會發現 Scrollbar 常常會沒有變短,且位置沒有更新到

2.想到其他的狀況 如:(1)刪除其中一筆資料,或是(2)排序資料的話 是用 HorizontalScroll_RandomSize 類似的情況,不同大小的 prefab 的 Cell 的話 這種情況應該只能這樣呼叫吧? scorll.totalCount = scorll.totalCount - 1; scorll.RefillCells()

3.請問有辦法取得目前畫面中的最左邊且完整的顯示 Cell 的 Index 嗎? 我想說2-(1)的情況後,想要再呼叫 SrollToCell() 看感覺會不會好點?

qiankanglai commented 2 years ago

剛剛測試發現新增一筆資料並呼叫 RefreshCells()的情況

通过刚pull request的例子我很容易复现到了 🤣 已修复

当删除的时候,RefreshCells其实也是可以的,因为会检查if (itemTypeEnd < totalCount)

最左边的cell其实就是itemTypeStart,但是是否完整显示会麻烦一些

SyaoranChang commented 2 years ago

当删除的时候,RefreshCells其实也是可以的,因为会检查if (itemTypeEnd < totalCount)

1.刪除第1筆資料的時候,如果是呼叫 RefreshCells(),這時的第1個 Cell 並沒有更新成正確的 prefab 並不是把第1個Cell 刪除,讓第2個 Cell往左補上 只是把舊的第一個Cell的內容重新顯示成第2筆資料的數值而已

2.剛測試 新增一筆資料並呼叫 RefreshCells()的情況 Scrollbar 有變短,位置也有更新了 感謝修正~

3.關於變數 itemTypeStart 似乎外部無法取得這個資料?

qiankanglai commented 2 years ago

1.刪除第1筆資料的時候,如果是呼叫 RefreshCells(),這時的第1個 Cell 並沒有更新成正確的 prefab 並不是把第1個Cell 刪除,讓第2個 Cell往左補上 只是把舊的第一個Cell的內容重新顯示成第2筆資料的數值而已

对,因为之前我只考虑单个prefab的情况所以只需要原地刷新。multi prefab的时候确实只能先Clear在Refresh了。

itemTypeStart可以加个public getter

SyaoranChang commented 2 years ago

对,因为之前我只考虑单个prefab的情况所以只需要原地刷新。multi prefab的时候确实只能先Clear在Refresh了。

itemTypeStart可以加个public getter

LoopScrollRect.cs 新增了 GetItemTypeStart() 也調整了一些東西,請你看看覺得如何了 Change namespace to avoid conflict #110

關於 SrollToCell() 不知道多一個 移動時間 的模式不知道好不好改?

SyaoranChang commented 2 years ago

因為新修改有衝突 所以我重新改寫然後重新 pull request 了 InitOnStart_Custom add Button.onClick event and more #112

qiankanglai commented 2 years ago

抱歉这两天 工作的事情有点忙orz 我元旦假期的时候在一起处理下

qiankanglai commented 2 years ago

我优化了下GetItemTypeStart()函数,现在是返回精确的第一个显示着的item 并带上offset信息(因为可能Hierarchy里看到的第一个元素实际上是在view bounds之外的) 这样就能在删掉某个元素之后,精确的保持内容不变了~ 不知道这样是否更符合你的需求 111

qiankanglai commented 2 years ago

關於 SrollToCell() 不知道多一個 移動時間 的模式不知道好不好改?

这个好办,如果今天下班早 晚上就可以搞定orz

SyaoranChang commented 2 years ago

我优化了下GetItemTypeStart()函数,现在是返回精确的第一个显示着的item 并带上offset信息(因为可能Hierarchy里看到的第一个元素实际上是在view bounds之外的) 这样就能在删掉某个元素之后,精确的保持内容不变了~ 不知道这样是否更符合你的需求

很感謝你的幫助~ 這就是我想要的結果

qiankanglai commented 2 years ago

我额外实现了一个ScrollToCellWithinTime接口,其实本质还是计算距离之后换算速度 调用老的SrollToCell接口

SyaoranChang commented 2 years ago

感謝了

SyaoranChang commented 2 years ago

新增了 SrollToCellWithTime 的範例 DemoScene_MultiCell.unity Add SrollToCellWithTime sample #115