我有这样的RecyclerView.OnScrollListener
findViewById(R.id.button_scroll_to_position).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mLinearLayoutManager.scrollToPositionWithOffset(2,0);
}
});
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
Log.i("TAG", "scroll " + dy);
}
});
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 7; i++) {
list.add("" + i);
}
mRecyclerView.setAdapter(new SimpleRVAdapter(list));
mLinearLayoutManager.scrollToPositionWithOffset(2,0);
然而,在某些情况下,onScrolled
不调用事件RecyclerView
已滚动(使用scrollToPositionWithOffset
)。
我知道原因是当我们使用scrollToPositionWithOffset
(或scrollToPosition
)时onScrolled
仅在firstVisibleItem
和lastVisibleItem
改变时调用.您可以在演示中看到(如果firstVisibleItem=2和lastVisibleItem=5 =〉onScrolled未被调用,firstVisibleItem=2和lastVisibleItem=6 =〉onScrolled将被调用)
使用scrollToPosition
时,是否有任何技巧或变通方法可以始终接收onScrolled
?
任何帮助或建议将不胜感激。
4条答案
按热度按时间0h4hbjxa1#
我发现
如果
RecyclerView
被滚动(通过使用scrollToPosition),而firstVisibleItem
和lastVisibleItem
不改变则不调用RecyclerView.OnScrollListener
,但调用View.OnLayoutChangeListener。因此,现在我使用
OnScrollListener
和OnLayoutChangeListener
来监听RecyclerView
滚动。我仍在寻找更好的解决方案
nbnkbykc2#
当你调用
scrollToPosition()
时,滚动从未调用。来自文档
滚动到某个位置的便利方法。RecyclerView不实现滚动逻辑,而是转发对scrollToPosition(int)的调用
因此
scrollToPosition(int)
没有实现滚动逻辑。如需了解更多信息,请查看此链接。https://developer.android.com/reference/android/support/v7/widget/循环视图。
czq61nw13#
我知道我是在让线坏死,但万一有人像我一样碰到它...
如果您不关心动画用途:
它会触发
wkyowqbh4#
您可以尝试使用OnGlobalLayoutListener来修复此问题。OnGlobalLayoutListener正在修复此问题,方法是直接在RecyclerView上使用scrollBy函数进行少量滚动
感谢Jakub的帮助:)