RecyclerView原理解析

转载请注明:https://blog.youkuaiyun.com/feather_wch/article/details/79932523

参考和学习资料

  1. 自定义LayoutManager

  2. RecyclerView绘制流程解析

  3. LinearLayoutManager填充、测量、布局过程

  4. 掌握自定义LayoutManager(一) 系列开篇 常见误区、问题、注意事项,常用API

  5. 把RecyclerView撸成 马 蜂 窝

  6. 深入了解RecyclerView预布局状态(preLayout)

  7. preLayout\postLayout

1、LayoutManager的作用

  1. layout(布局)子视图
  2. 滚动过程中根据子视图布局中所处的位置,决定何时添加和回收子视图
  3. 滚动子视图。

2、RecyclerView与LayoutManager的联系

  1. RV设置LayoutManager会调用requestLayout()进行View树的重绘,最终会走RV的测量、布局、绘制三大流程。
  2. RV子View的测量、布局最终都在布局阶段交由LayoutManageronLayoutChildren完成

3、LinearLayoutManager的主要方法

方法 解释
onLayoutChildren LayoutManager的主入口,在初始化布局时调用。如果Adapter数据改变或者Adapter被替换时,会再次调用。作用:初始化时放置Item,直至填满布局为止。
canScrollHorizontally() & canScrollVertically() 当想要滚动的方向,与当前布局方向相同时,在对应方法返回true,另一个返回false。
scrollHorizontallyBy() & scrollVerticallyBy() RecyclerView已经处理了触摸事件,会将相应的偏移值(dx/dy)传入这两个方法中的对应方法。根据偏移值需要完成三件事:1、将所有Item视图移动到适当位置 2、决定移动视图后 添加/移除 视图。 3、返回滚动的实际距离。框架会根据它判断你是否触碰到边界。

4、LinearLayoutManager的滚动方法源码分析。


    /**==============================================
     * RecyclerView的三种状态: 1-开始;2-布局;3-动画
     *==============================================*/
    public static class State {
    
    
        static final int STEP_START = 1;
        static final int STEP_LAYOUT = 1 << 1;
        static final int STEP_ANIMATIONS = 1 << 2;
        //xxx
    }

    /**================================================
     * 1、是否支持水平/垂直滚动
     *  1. 如果可以水平滚动,canScrollHorizontally()就返回true
     *  2. 如果可以垂直滚动,canScrollVertically()就返回true
     * @return
     *=============================================*/
    @Override
    public boolean canScrollHorizontally() {
    
    
        return mOrientation == HORIZONTAL;
    }
    @Override
    public boolean canScrollVertically() {
    
    
        return mOrientation == VERTICAL;
    }

    /**
     * 2、处理滚动事件.
     * RecyclerView处理滚动事件后,会调用对应方向的方法,并传入dx/dy偏移值。
     */
    @Override
    public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
    
    
        if (mOrientation == VERTICAL) {
    
    
            return 0;
        }
        return scrollBy(dx, recycler, state);
    }
    @Override
    public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
    
    
        if (mOrientation == HORIZONTAL) {
    
    
            return 0;
        }
        return scrollBy(dy, recycler, state);
    }

    /**
     * 进行滑动
     */
    int scrollBy(int dy
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猎羽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值