课堂笔记
### 设置RecyclerView的高度 - NestedScrollView 嵌套 RecyclerView 时,RecyclerView 的高度是所有 item 高度和,会一次性创建所有的 item ,起不到复用的效果,所以要手动给 RecyclerView 设置一个合适的高度( ViewPager 的高度,也就是 HomePagerFragment 的布局高度) - 找到并绑定布局
    @BindView(R.id.home_pager_parent)
    public LinearLayout homePagerParent;
- 给 homePagerParent 注册一个观察者 ViewTreeObserver 来监听视图树,当视图树的布局发生改变时,ViewTreeObserver 会收到通知
- 给 RecyclerView 的布局高度设为 homePagerParent 的高度
- 移除 OnGlobalLayoutListener,当视图树布局发生变化时不会再收到通知了
    homePagerParent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int measuredHeight = homePagerParent.getMeasuredHeight();
            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) mContentList.getLayoutParams();
            layoutParams.height = measuredHeight;
            mContentList.setLayoutParams(layoutParams);
            if (layoutParams.height != 0) {
                homePagerParent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        }
    });
解决 NestedScrollView 嵌套 RecyclerView 滑动冲突问题
- 大概意思:重写 NestedScrollView 里的方法,让 NestedScrollView 先消费掉一些滑动事件,再把剩下的滑动事件全部给 RecyclerView 消费
- 创建类 TbNestedScrollView 继承 NestedScrollView ,替换布局里的 NestedScrollView,重写其中的两个方法
public class TbNestedScrollView extends NestedScrollView {
    private int height;
    private int originScroll;
    public TbNestedScrollView(@NonNull Context context) {
        super(context);
    }
    public TbNestedScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public TbNestedScrollView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    // 设置要滑出的顶部距离
    public void setHeaderHeight(int mHeaderHeight) {
        height = mHeaderHeight;
    }
    @Override
    public void onNestedPreScroll(@NonNull View target, int dx, int dy, @NonNull int[] consumed, int type) {
        if (originScroll < height) {
	    // 滑动到的位置
            scrollBy(dx, dy);
            consumed[0] = dx;
            consumed[1] = dy;
        }
        super.onNestedPreScroll(target, dx, dy, consumed, type);
    }
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
	// 滑动时改变的高度
        originScroll = t;
        super.onScrollChanged(l, t, oldl, oldt);
    }
}
- 赋值滑动高度
    @Override
    protected void initListener() {
        homePagerParent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int headerHeight = homePagerHeaderContainer.getMeasuredHeight();
                homePagerNestedScroller.setHeaderHeight(headerHeight);
		......
- 代码很少,老师讲的很多很细,具体内容原理请看视频



