在RecyclerView.OnScrollListener
的onScrolled()
方法中,我需要能够区分两个不同的scroll事件源:
- 用户使用触摸事件滚动
RecyclerView
- 使用
scrollToPosition()
滚动RecyclerView
的代码
onScrolled()
中没有任何参数可以涵盖这一点,是否有一个方法可以区分这一点?
FWIW,我的场景:我有两个RecyclerView
小部件。一个是主部件,显示传统的垂直列表。另一个是ViewPager
替代部件,允许滑动垂直列表中相同项目的详细信息。在大屏幕环境中,两个RecyclerView
小部件将同时可见如果用户滑动寻呼机RecyclerView
,我需要更改列表RecyclerView
行上的指示符以进行匹配。如果用户点击列表RecyclerView
中的行,我需要更新寻呼机RecyclerView
中的当前页面。为了侦听寻呼机上的滑动事件,我使用了OnScrollListener
,但当 * 我 * 滚动寻呼机以响应列表行单击时,也会触发该事件。
2条答案
按热度按时间zzoitvuj1#
Gabe Sechan关于使用滚动状态更改的建议是一个很好的建议。
不幸的是,没有用于scroll状态的侦听器--它要求您子类化
RecyclerView
。scrollToPosition()
不会触发滚动状态更改,而用户滑动会。鉴于此,我不需要标志或任何其他状态,这有助于使逻辑更简单。
1yjd4xko2#
如果您使用
smoothScrollBy()
或smoothScrollToPosition()
,则接受的答案将不起作用。判断滚动是否来自用户的唯一方法是在用户拖动时设置一个标志,当发生这种情况时,RecyclerView
状态将更改为RecyclerView.SCROLL_STATE_DRAGGING
。然后,当状态更改为RecyclerView.SCROLL_STATE_IDLE
时,您需要清除该标志。