RecyclerView#smoothScrollToPosition调用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--;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tinyvampirepudge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值