注:本文只说明大概的实现过程,并不放置完整的代码
mProductsRcv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
//滑动停止后处理,可以做回弹工作
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//滑动过程,记录dx,从而让C随着移动
}
});
setTranslationX
adapter.notifyDataSetChanged
smoothScrollToPosition
onInterceptTouchEvent
拦截@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchX = ev.getX();
mTouchY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
if (checkIsMove(ev.getX(), ev.getY())) {
mTouchX = mTouchY = 0;
isBrandInTouch = false;//不是点击事件了
}
break;
case MotionEvent.ACTION_UP:
if (mTouchX != 0 && mTouchY != 0 && isBrandInTouch
&& !checkIsMove(ev.getX(), ev.getY())
&& mBrandClickListener != null) {
// 触发点击事件咯
}
mTouchX = mTouchY = 0;
isBrandInTouch = false;
break;
}
return super.onInterceptTouchEvent(ev);
}
// mTouchSlop是较小点击判断
// ViewConfiguration.get(getContext()).getScaledTouchSlop();
private boolean checkIsMove(float x, float y) {
return Math.abs(mTouchX - x) > mTouchSlop || Math.abs(mTouchY - y) > mTouchSlop;
}