RecyclerView#smoothScrollToPosition调用RecyclerView#OnScrollListener的过程

简介: 项目中使用到了RecyclerView#smoothScrollToPosition(0)方法让Recyclerview滚动到顶部,同时给Recyclerview设置了监听器RecyclerView.OnScrollListener。

RecyclerView#smoothScrollToPosition调用RecyclerView#OnScrollListener的过程

项目中使用到了RecyclerView#smoothScrollToPosition(0)方法让Recyclerview滚动到顶部,同时给Recyclerview设置了监听器RecyclerView.OnScrollListener,代码如下所示:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
    }
});

recyclerView.smoothScrollToPosition(0);

这里想简单聊下代码调用的过程。

RecyclerView#addOnScrollListener():
实现如下:
public void addOnScrollListener(OnScrollListener listener) {
    if (mScrollListeners == null) {
        mScrollListeners = new ArrayList<>();
    }
    mScrollListeners.add(listener);
}
    
    
将监听器添加进RecyclerView的成员变量List<OnScrollListener> mScrollListeners中。

我们看下使用mScrollListeners的值的地方,有两处:

RecyclerView#dispatchOnScrolled

RecyclerView#dispatchOnScrollStateChanged

好,接下来我们看下recyclerView.smoothScrollToPosition()是如何调用到我们刚才添加的OnScrollListener监听器的:

RecyclerView#smoothScrollToPosition(int position) 
-->

RecyclerView.LayoutManager#smoothScrollToPosition(RecyclerView recyclerView, State state, int position)

--> 实现类

LinearLayoutManager#smoothScrollToPosition(RecyclerView recyclerView, State state, int position)

-->

LinearLayoutManager#startSmoothScroll(SmoothScroller smoothScroller)

-->

mRecyclerView.mViewFlinger.postOnAnimation();

-->

Recyclerview.SmoothScroller#start(RecyclerView recyclerView, LayoutManager layoutManager)

-->

mRecyclerView.mViewFlinger.postOnAnimation();

-->

RecyclerView.ViewFlinger#postOnAnimation()

-->

ViewCompat.postOnAnimation(RecyclerView.this, this);

-->

RecyclerView.ViewFlinger#run()

-->

if (hresult != 0 || vresult != 0) {
    dispatchOnScrolled(hresult, vresult);
}

好了,这里调用到了我们刚才记录下来的RecyclerView#dispatchOnScrolled了,这个方法里面我们会依次调用RecyclerView的mScrollListeners。

代码如下所示:

void dispatchOnScrolled(int hresult, int vresult) {
    ...
    if (mScrollListeners != null) {
        for (int i = mScrollListeners.size() - 1; i >= 0; i--) {
            mScrollListeners.get(i).onScrolled(this, hresult, vresult);
        }
    }
    mDispatchScrollCounter--;
}
相关文章
|
30天前
|
Android开发
RecyclerView的简单使用在activity和fragment中
RecyclerView的简单使用在activity和fragment中
21 0
|
Android开发 开发者
RecyclerView定制:通用ItemDecoration及全展开RecyclerView的实现
RecyclerView定制:通用ItemDecoration及全展开RecyclerView的实现
391 0
RecyclerView定制:通用ItemDecoration及全展开RecyclerView的实现
|
存储 缓存 开发工具
RecyclerView#Adapter#notifyDataSetChanged方法后,为何还会新建ViewHolder?
RecyclerView#Adapter#notifyDataSetChanged方法后,为何还会新建ViewHolder?
RecyclerView学习-RecyclerView#Adapter#notifyDataSetChanged是如何更新数据的?
RecyclerView学习-RecyclerView#Adapter#notifyDataSetChanged是如何更新数据的?
|
缓存 Android开发
Android RecyclerView 绘制流程及Recycler缓存(上)
RecyclerView 源码一万多行,想全部读懂学会挺麻烦的,感兴趣的可以自己去瞅瞅,这篇文章重点来看下 RecyclerView是如何一步步将每一个 ItemView 显示到屏幕上,然后再分析在显示和滑动过程中,是如何通过缓存复用来提升整体性能的。 RecyclerView本质上也是一个 自定义控件 ,因此我们可以沿着分析其 onMeasure -> onLayout -> onDraw 这 3 个方法的路线来深入研究。
207 0
Android RecyclerView 绘制流程及Recycler缓存(上)
|
缓存 Android开发 容器
Android RecyclerView 绘制流程及Recycler缓存(下)
缓存复用原理 Recycler 缓存复用是 RecyclerView 中另一个非常重要的机制,这套机制主要实现了 ViewHolder 的缓存以及复用。
343 0
|
缓存 算法
深入讲解RecyclerView布局动画原理(一)
深入讲解RecyclerView布局动画原理(一)
深入讲解RecyclerView布局动画原理(一)
深入讲解RecyclerView布局动画原理(二)
深入讲解RecyclerView布局动画原理(二)
深入讲解RecyclerView布局动画原理(二)
|
Java 容器
【RecyclerView】二、RecyclerView 简介 ( RecyclerView 特点 | RecyclerView 涉及到的类 )
【RecyclerView】二、RecyclerView 简介 ( RecyclerView 特点 | RecyclerView 涉及到的类 )
161 0
|
Android开发
【Android 事件分发】ItemTouchHelper 事件分发源码分析 ( 绑定 RecyclerView )(一)
【Android 事件分发】ItemTouchHelper 事件分发源码分析 ( 绑定 RecyclerView )(一)
173 0