diff --git a/arkoala-arkts/arkui/src/LazyForEach.ts b/arkoala-arkts/arkui/src/LazyForEach.ts index 3acd403c246fe99c54bfa7fec5cc40f6acc568a9..9b3acfe29ce7944687ca043ff76a8d23d3888160 100644 --- a/arkoala-arkts/arkui/src/LazyForEach.ts +++ b/arkoala-arkts/arkui/src/LazyForEach.ts @@ -116,24 +116,53 @@ export function LazyForEach(dataSource: IDataSource, keyGenerator?: (item: T, index: number) => string, ) { let current = rememberMutableState(-1) + let prevStart = rememberMutableState(-1) let mark = rememberMutableState(nullptr) - let version = rememberMutableState(0) - console.log(`LazyForEach current=${current.value} version=${version.value} mark=${mark.value}`) + let end = rememberMutableState(-1) + let version = rememberMutableState(0) + const rangeMode = true + console.log(`LazyForEach current=${current.value} version=${version.value} mark=${mark.value}`) let parent = contextNode() const visibleRange = new VisibleRange(parent, current.value, current.value) remember(() => { - LazyForEachManager.OnRangeUpdate(visibleRange.parent, dataSource.totalCount() as int32, (currentIndex: int32, currentMark: pointer, end: int32) => { + LazyForEachManager.OnRangeUpdate(visibleRange.parent, dataSource.totalCount() as int32, (currentIndex: int32, currentMark: pointer, e: int32) => { console.log(`LazyForEach[${parent}]: current updated to ${currentIndex} ${currentMark} end=${end}`) + prevStart.value = current.value current.value = currentIndex mark.value = currentMark - version.value++ + end.value = e }) }) // Subscribe to version changes. version.value let generator = (element: T, index: number): int32 => keyGenerator ? hashCodeFromString(keyGenerator!(element, index)) : index as int32 + + if (rangeMode) { + for (let i = current.value as int32; i <= end.value; i++) { + parent.setInsertMark(nullptr, false) + if (i < 0 || i >= dataSource.totalCount()) break + if (i < prevStart.value) { + if (i == current.value) { + parent.setInsertMark(mark.value, true) // insert before the previous range + } else { + parent.changeInsertDirection(false) // insert after the first element + } + } + const element: T = dataSource.getData(i as int32) + memoEntry2( + __context(), + generator(element, i as int32), + (element: T, index: number): void => itemGenerator(element, index), + element, + i as int32 + ) + } + LazyForEachManager.Prepare(parent) // temp: use prepare to map node to index + return + } + let index: number = visibleRange.indexUp as number LazyForEachManager.Prepare(parent) diff --git a/arkoala-arkts/arkui/src/generated/PeerNode.ts b/arkoala-arkts/arkui/src/generated/PeerNode.ts index d39f4d705078b83b4353c2d3787b3e52ac394aa3..9fc6f72c9769e53cfa8d1672cec4fff1a6e133f5 100644 --- a/arkoala-arkts/arkui/src/generated/PeerNode.ts +++ b/arkoala-arkts/arkui/src/generated/PeerNode.ts @@ -30,6 +30,10 @@ export class PeerNode extends IncrementalNode { this.insertDirection = upDirection ? 0 : 1 } + changeInsertDirection(upDirection: boolean) { + this.insertDirection = upDirection ? 0 : 1 + } + constructor(peerPtr: pointer, id: int32, name: string, flags: int32) { super(PeerNodeType) this.id = id