课堂笔记
### 设置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);
......
- 代码很少,老师讲的很多很细,具体内容原理请看视频