recyclerview 怎么才能左右滑动

发布网友

我来回答

2个回答

热心网友

关于RecyclerView.OnItemTouchListener的几个方法我也学习了下也不是很难主要是拦截与操作这两个东西一定要配合好,还有就是RecyclerView的滚动状态,因为在RecyclerVIew滚动的时候我们的滑动菜单是不能操作的不然就会产生混乱,在项目开发的时候由于我的Item是有onClick事件的,那么在用户滑出菜单的时候也要把onClick事件给拦截但是又不能拦截菜单的Onclick事件我是通过容器的rect与scrollX的偏移来解决这个问题的可以看源码就知道呢。下面是拦截代码。

@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

if(!mCallback.isEnable())
return false;

int action = MotionEventCompat.getActionMasked(e);
int x = (int) e.getX();
int y = (int) e.getY();

/*
* 当我们没有发生drag事件的时候cancel或up事件会发生interceptTouchEvent里面,如果TargetView等于空的时候直接
* 返回false,不拦截事件
* */
if(action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP)
if(mTargetView == null)
return false;

boolean needIntercept = false;
switch (action) {
case MotionEvent.ACTION_DOWN:

mActivePointerId = MotionEventCompat.getPointerId(e, 0);
mLastX = (int) e.getX();
mLastY = (int) e.getY();

//查找需要显示菜单的view;
mTargetView = mCallback.findTargetView(x, y);

/*
* 如果正在动画则拦截事件
* */
if (mExpandAndCollapseAnim != null) {
//mExpandAndCollapseAnim.cancel();
mExpandAndCollapseAnim = null;
needIntercept = true;
}
break;
case MotionEvent.ACTION_MOVE:

int deltaX = (x - mLastX);
int deltaY = (y - mLastY);

if(Math.abs(deltaY) > Math.abs(deltaX))
return false;

//如果移动距离达到要求,则拦截
needIntercept = mIsDragging = mTargetView != null && Math.abs(deltaX) >= mTouchSlop;
break;

case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:

/*
* 当一个up事件发生在正常的范围内且scrollX等于scrollRange则折叠view并拦截UP事件
* 防止view响应点击事件
* */
if(isExpanded()){

if (inView(x, y)) {
//拦截事件,防止targetView执行onClick事件
needIntercept = true;
}else{
//如果走这那行这个ACTION_UP的事件会发生在右侧的菜单中
}

//折叠菜单
mTargetView.setScrollX(0);
}
dispatchCollapsedOrExpanded();
break;
}

return needIntercept && mTargetView != null;
}

热心网友

CSDN上有这么一篇博客:打造最强RecyclerView侧滑菜单,长按拖拽,滑动删除,下拉刷新上拉加载。
原文可能可以更好的帮助到题主:blog.csdn.net/yanzhenjie1003/article/details/52115566

这篇博客介绍了一个RecyclerView的控件,支持以下功能,非常强大。
1. RecyclerView侧滑菜单(左右两侧都可以添加)(List、Grid两种形式)。
2. RecyclerView长按拖拽Item(List、Grid两种形式)。
3. RecyclerView侧滑删除item(List、Grid两种形式)。
4. 指定RecyclerView的某一个Item不能滑动删除或长按拖拽(List、Grid两种形式)。
5. 根据Item的ViewType来决定显示的菜单。
6. 用SwipeMenuLayout在任何地方都可以实现你自己的侧滑菜单。
7. 使用SwipeRefreshLayout下拉刷新。(更新)
8. 解决和ViewPager嵌套使用的滑动冲突。(更新)

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com