小红书效果

分析
下面就用思路二来分析一下如何实现
- recyclerView 上滑时,如果手指没有滑过 recyclerView 的顶部,那么 recyclerView 自己消费滑动事件;否则开始嵌套滑动(整体上滑)。当手指抬起时候如果滑动距离大于 50dp ,通过惯性滑动滑到顶部,否则滑回到初始位置

- recyclerView 下滑时,如果recyclerView的第一个 item 不是完全可见,那么 recyclerView 自己消费滑动事件;否则开始嵌套滑动(整体下滑)。当手指抬起时候如果滑动距离大于 50dp ,通过惯性滑动滑到底部,否则滑回到初始位置

实现
NestedRecyclerView(NestScrollChild)
public class NestedRecyclerView extends RecyclerView {
private float topPadding = Utils.dp2Px(50);
private float scrollSlop = Utils.dp2Px(50); //滑动超过这个距离松手后自动自动滑动到顶部
private float downY;
private float moveY;
private float deltaMoveY;
private float deltaDownMoveY;
private float lastMoveY;
public OverScroller mScroller;
private int firstCompletelyVisiblePosition;
public NestedRecyclerView(@NonNull Context context) {
this(context, null);
}
public NestedRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
mScroller = new OverScroller(context);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("NestedRecyclerView", "ACTION_DOWN");
downY = event.getRawY();
lastMoveY = event.getRawY();
break;
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("NestedRecyclerView", "ACTION_DOWN");