使用scrollToPosition时未调用RecyclerView onScrolled

时间:2017-08-15 04:09:36

标签: android android-recyclerview

我有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(或scrollToPositiononScrolled时,只有在firstVisibleItemlastVisibleItem更改时才会调用。您可以在演示中看到(如果firstVisibleItem = 2且lastVisibleItem = 5 =&gt; onScrolled未调用,则firstVisibleItem = 2且lastVisibleItem = 6 =&gt; onScrolled将被调用)

使用onScrolled时是否有任何技巧或变通方法可以随时收到scrollToPosition

enter image description here

非常感谢任何帮助或建议。

3 个答案:

答案 0 :(得分:5)

我发现了 如果滚动firstVisibleItem(使用scrollToPosition),而lastVisibleItemRecyclerView.OnScrollListener不会更改那么 OnScrollListener未调用但Click here for more details调用< / p>

因此,现在我同时使用OnLayoutChangeListenerRecyclerView进行收听{{1}}滚动。

我仍在寻找更好的解决方案

答案 1 :(得分:0)

我知道我正在破坏线程,但以防万一有人像我一样遇到它...

如果您不关心动画的使用:

recyclerView.smoothScrollToPosition(position);

它将触发

OnScrollListener.onScrolled(RecyclerView recyclerView, int dx, int dy)

答案 2 :(得分:-1)

当你打电话给scrollToPosition() onScroll时,从未打电话。

来自文档

  

滚动到某个位置的便捷方法。 RecyclerView有   不实现滚动逻辑,而是转发呼叫   scrollToPosition(INT)

所以scrollToPosition(int)没有实现滚动逻辑。

有关详细信息,请查看此链接。https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#scrollToPosition(int)