package com.example.myapplication1.view;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
public class MyLinearLayoutManager extends RecyclerView.LayoutManager {
@Override
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
int offsetY = 0;
for (int i = 0; i < getItemCount(); i++) {
View viewForPosition = recycler.getViewForPosition(i);
addView(viewForPosition);
measureChildWithMargins(viewForPosition,0,0);
int measuredHeight = viewForPosition.getMeasuredHeight();
int measuredWidth = viewForPosition.getMeasuredWidth();
layoutDecorated(viewForPosition,0,offsetY,measuredWidth,offsetY+measuredHeight);
offsetY += measuredHeight;
}
}
@Override
public boolean canScrollVertically() {
return true;
}
/**
*
* @param dy 往下滑动 dy < 0 ,往上滑动, dy > 0
* @param recycler
* @param state
* @return
*/
@Override
public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
View firstView = getChildAt(0);
int top = firstView.getTop();
View lastView = getChildAt(getChildCount() - 1);
int bottom = lastView.getBottom();
//RecyclerView的实际可容纳空间的高度
int height = getHeight() - getPaddingBottom() - getPaddingTop();
//将偏移量转换成符合逻辑的,即:向下为正,向上为负
int newDy = -dy;
//顶部:
//第一个view的顶部与RecyclerView的顶部刚好重合,不能再往下滑动了,newDy >0 代表向下滑动
if (top == 0 && newDy > 0){
return 0;
}
//top <0 说明recyclerView中的内容已经向上滑动一段距离
//如果(top + newDy,即新的top)>0 就让它等于0,让它等于0的条件,就是 newDy = -top
if (top < 0 && top + newDy > 0){
newDy = -top;
}
//底部:== 0,最后一个View的底边 与RecyclerView的底边已重合,不能再往上滑动了
//底部, < 0 的情况是内容过少 未充满RecyclerView,就是 最后一个itemView 的bottom 天生比 RecyclerView的 height 小
if(bottom <= height && newDy <0){
return 0;
}
//已经超出了RecyclerView的底边,但是要保证不能小于滑动到底边里面(即上部)
//bottom + newDy < height 时,bottom + newDy = height,所以 newDy = height - bottom = -(bottom - height)
if (bottom > height && bottom + newDy < height){
newDy = - (bottom - height);
}
offsetChildrenVertical(newDy);
return dy;
}
}