使用scrollToPosition时未调用RecyclerView onScrolled

Pha*_*inh 3 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);
Run Code Online (Sandbox Code Playgroud)

但是在某些情况下onScrolled不要调用事件RecyclerView已滚动(使用scrollToPositionWithOffset).
我知道原因是当我们使用scrollToPositionWithOffset(或scrollToPosition)onScrolled只调用时firstVisibleItemlastVisibleItem更改.可以在演示中看到(如果firstVisibleItem = 2和lastVisibleItem = 5 => onScrolled不叫,firstVisibleItem = 2和lastVisibleItem = 6 => onScrolled将称为)

是否有任何技巧或解决方法onScrolled在使用时始终接收scrollToPosition

在此输入图像描述

任何帮助或建议将非常感谢.

Pha*_*inh 5

我发现,
如果RecyclerView被滚动(通过使用scrollToPosition),而firstVisibleItemlastVisibleItem没有改变THEN RecyclerView.OnScrollListener不叫,但View.OnLayoutChangeListener

因此,现在我使用两者OnScrollListenerOnLayoutChangeListener用于收听RecyclerView滚动.

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


Bhu*_* BS 0

当你调用scrollToPosition()onScroll 时从未调用过。

从文档中

滚动到某个位置的便捷方法。RecyclerView没有实现滚动逻辑,而是将调用转发给scrollToPosition(int)

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

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