转载请注明:https://blog.youkuaiyun.com/feather_wch/article/details/79932523
参考和学习资料
1、LayoutManager的作用
layout(布局)子视图- 滚动过程中根据
子视图在布局中所处的位置,决定何时添加和回收子视图滚动子视图。
2、RecyclerView与LayoutManager的联系
RV设置LayoutManager会调用requestLayout()进行View树的重绘,最终会走RV的测量、布局、绘制三大流程。RV的子View的测量、布局最终都在布局阶段交由LayoutManager的onLayoutChildren完成
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

最低0.47元/天 解锁文章
422

被折叠的 条评论
为什么被折叠?



