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

时间:2015-11-11 15:47:25

标签: android listview scroll position height

我有两个不同元素高度的列表视图,但它们显示相同的数据。一张图片将很好地解释一切:

smaller list element represents bigger list element

右侧的列表视图是左侧列表视图的滚动条表示(红色/灰色/紫色日期列表,未来日期上升,过去几天下降,无尽滚动侦听器填充相同的列表)。

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

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

修改

我已设法使用代码

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

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

1 个答案:

答案 0 :(得分:0)

经过大量的反复试验后,我找到了实现同步滚动工作的最佳方法,因此我将分享这个想法并在必要时进行详细说明。

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

目前正在运行的第二种方法是计算列表视图的中心,计算中间孩子(当前孩子点击列表视图中心)以及列表视图中心和中间儿童中心middleElement.getTop() + middleElement.getHeight() /2;之间的当前距离。然后我使用middlePoistion = listView.getPositionForView(middleElement);获取当前位于中间的位置并移动列表,因此具有middlePosition的相同元素将位于屏幕的中心,但是从元素中心到列表视图中心的距离偏移:{{1}与中心的距离可以是负的也可以是正的。如果有人需要更多解释或代码片段,请询问。