参考https://www.jianshu.com/p/ed7fce51e5b5
参考别人的代码,自己写的例子,需要导入RecyclerView 的BaseQuickAdapter,这个网上有很多例子的
自定义HorizontalScrollView,向外提供滑动监听功能
import android.content.Context;
import android.util.AttributeSet;
import android.widget.HorizontalScrollView;
/**
* @author zpn
* 自定义HorizontalScrollView,向外提供滑动监听功能
*/
public class ObservableHorizontalScrollView extends HorizontalScrollView {
private ScrollViewListener scrollViewListener = null;
public ObservableHorizontalScrollView(Context context) {
super(context);
}
public ObservableHorizontalScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
public ObservableHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
if (scrollViewListener != null) {
scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
}
}
public interface ScrollViewListener {
void onScrollChanged(ObservableHorizontalScrollView scrollView, int x, int y, int oldx, int oldy);
}
}
处理被HorizontalScrollView嵌套时,手指快速上下滚动事件被抢先处理问题
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
/**
* @author zpn
* 处理被HorizontalScrollView嵌套时,手指快速上下滚动事件被抢先处理问题
*/
public class MyRecyclerView extends RecyclerView {
private float mDownX;
private float mDownY;
public MyRecyclerView(@NonNull Context context) {
super(context);
}
public MyRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
//事件分发
//dispatchTouchEvent->onInterceptTouchEvent->onTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent e) {
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = e.getRawX();
mDownY = e.getRawY();
break;
case MotionEvent.ACTION_MOVE:
float rawX = e.getRawX();
float rawY = e.getRawY();
float dx = Math.abs(mDownX - rawX);