首页 > 解决方案 > 同时滚动两个视图

问题描述

首先是这个想法:我试图同时滚动两个视图。意味着,当您滚动第一个时,第二个将同时滚动。布局如下:

在此处输入图像描述

现实:我有两个列表,一个是水平的,另一个是垂直的。水平的包含类别列表,垂直的包含来自这些类别的图像。类别 1、类别 2 和类别 3 是 RecyclerView 的项目。RV1、RV2 和 RV3 是三个水平回收站视图。目前,我将这些“RV1、RV2 和 RV3”放在具有垂直 ScrollView 父级的垂直 LinearLayout 中。我不确定是否应该用recyclerview 替换这个linearlayout 和scrollview。但是这个想法保持不变,当用户滚动一个列表时,我需要滚动另一个列表。

更加具体

  1. 当我滚动类别水平列表并将“类别 2”置于最左侧位置时,垂直列表中的“RV 2”应位于最顶部位置。
  2. 如果我使用垂直列表,也会发生同样的情况。如果我将“RV 1”滚动到顶部,则“Category 1”也应该自动滚动并位于最左边的位置。
  3. “RV1、RV2 和 RV3”recyclerviews 可以自己水平滚动,这很好,这不是问题。

标签: androidandroid-recyclerview

解决方案


您应该能够对所需的行为进行如下建模:

onScrollListener向水平类别 RecyclerView添加一个。然后在里面,您可以使用或根据您的确切需求onScrolled确定最左边的项目。(链接适用于 LinearLayoutManager,这主要是您在那里使用的)firstVisibleItemPositionfirstCompletelyVisibleItemPosition

注意onScrolled在用户完成滚动后调用,所以如果你需要实时滚动,你可以尝试在里面做类似的事情onScrollStateChanged

无论如何,您现在将拥有一个int与最左侧类别的位置相对应的位置,该位置直接映射到需要被带到顶部的相应 RV 的位置。

我建议将您的ScrollViewLinearLayout组合切换到 RecyclerView,因为滚动到特定项目会更简单。您可以将之前检索到的索引传递给此垂直 RecyclerView 的smoothScrollToPositionorscrollToPosition方法,具体取决于内容应如何滚动。

您可以对垂直 RV 执行相同操作,以自动滚动类别。如果我没记错的话,程序scrollToPosition调用并没有触发任何附加onScrollListener的 s。如果这种情况发生了变化,那么您将必须确保它们不会不必要地相互滚动。


推荐阅读