两个ListViews(不同元素高度)的滚动和定位

Two ListViews (different element height) scrolling and positioning

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

右侧的列表视图是左侧列表视图的滚动条表示(red/gray/purple 天的列表,未来的天数上升,过去的天数下降,无尽的滚动侦听器填充同一个列表) .

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

第二个问题是在创建时,我在列表中有今天的索引(比方说从 100 开始的第 50 个),左侧列表中的 setSelection(50) 没问题,因为一个元素占据了大部分屏幕,但我没有知道如何 select scrollbarList 以便相同的元素在小圆指示器的中间可见,到目前为止 setSelectionFromTop(50, screenHeight/2) 有效。

编辑:

我已经成功地使用代码

将两个列表正确地定位到中心
dayListView.setSelectionFromTop(getTodayIndex(), screenHeight / 4);
scrollbarListview.setSelectionFromTop(getTodayIndex(), screenHeight / 2 - itemView.getMeasuredHeight() / 2);

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

经过反复试验,我找到了实现同步滚动的最佳方法,所以我将分享这个想法,并在需要时进行详细说明。

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

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