两个ListView(元素高度不同)滚动定位

Posted

技术标签:

【中文标题】两个ListView(元素高度不同)滚动定位【英文标题】:Two ListViews (different element height) scrolling and positioning 【发布时间】:2016-02-12 18:25:16 【问题描述】:

我有两个元素高度不同的列表视图,但它们显示的数据相同。一张图说明一切:

右侧的列表视图是左侧列表视图的滚动条表示(红色/灰色/紫色日期的列表,未来的日子向上,过去的日子在底部,无限的滚动侦听器填充相同的列表)。

第一个问题是滚动一个列表并平滑滚动另一个列表的能力(smoothScrollToPosition(firstVisibleItem) 不稳定,因为长时间滚动,第一个可见项目是同一个项目)。我需要在 ScrollbarList 中看到每个小滚动条,反之亦然。

第二个问题是在创建时,我在列表中有今天的索引(比如说从 100 到第 50 个),左侧列表中的 setSelection(50) 还可以,因为一个元素占据了大部分屏幕,但我不知道如何选择滚动条列表,以便在小圆圈指示器的中间可以看到相同的元素,到目前为止setSelectionFromTop(50, screenHeight/2) 正在工作。

编辑:

我已经设法使用代码将两个列表正确定位到中心

dayListView.setSelectionFromTop(getTodayIndex(), screenHeight / 4);
scrollbarListview.setSelectionFromTop(getTodayIndex(), screenHeight / 2 - itemView.getMeasuredHeight() / 2);

当没有附加 ScrollListener 时,两个列表元素都位于中心(除了无限滚动侦听器,它不与其他列表视图交互)。所以现在唯一的大问题是如何在仅滚动它们时以良好的纵横比平滑滚动它们。有什么想法吗?

【问题讨论】:

【参考方案1】:

经过多次尝试和错误,我找到了实现同步滚动的最佳方法,因此我将分享这个想法并在需要时进行详细说明。

第一种方法是计算任何列表的滚动增量并将smoothScrollBy(delta / aspectRatio) 与纵横比一起使用(我需要在每一步中计算纵横比,因为左侧列表的元素高度可能不同)。但是这种方式会使列表在滚动后很快就失去同步,因此被丢弃了。

当前工作的第二种方法是计算列表视图的中心,计算中间孩子(当前孩子点击列表视图中心)和列表视图中心与中间孩子中心之间的当前距离middleElement.getTop() + middleElement.getHeight() /2;。然后我使用middlePoistion = listView.getPositionForView(middleElement);获取当前在中间的位置并移动列表,这样与 middlePosition 相同的元素将位于屏幕的中心,但从元素中心到列表视图中心的距离偏移:otherListView.setSelectionFromTop(middlePoistion, otherListView.getHeight / 2 - otherListViewMiddleElement.getHeight() / 2 + distanceFromcenter); 和距离center 可以是负数也可以是正数。如果有人需要更多解释或代码 sn-ps,请询问。

【讨论】:

以上是关于两个ListView(元素高度不同)滚动定位的主要内容,如果未能解决你的问题,请参考以下文章

Flutter ListView没有滚动到最后一个元素

JQuery元素滚动定位及获取元素的scrollTop,clientHeight,scrollHeight

JQuery元素滚动定位及获取元素的scrollTop,clientHeight,scrollHeight

ListView

请问Python+Selenium怎么定位不断滚动的元素呢?

Android - 在 ListView 中滚动时滚动出/折叠元素