Android RecyclerView item条目实现侧滑删除和编辑(置顶)

在项目开发中常常会遇到这种需求,自己写吧 水平不够,自定义view绘制不是太好.多番查找资料和网上百度以后,终于实现了效果,废话不说了,看代码.

第一步:这是一个工具类代码较多:建议粘贴

import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.Scroller;

/**

  • Created by ${王栋栋}on 2019/08/21.
  • ASUS current user system login name
    */

public class SlideRecyclerView extends RecyclerView {

private static final String TAG = "SlideRecyclerView";
private static final int INVALID_POSITION = -1; // 触摸到的点不在子View范围内
private static final int INVALID_CHILD_WIDTH = -1;  // 子ItemView不含两个子View
private static final int SNAP_VELOCITY = 600;   // 最小滑动速度

private VelocityTracker mVelocityTracker;   // 速度追踪器
private int mTouchSlop; // 认为是滑动的最小距离(一般由系统提供)
private Rect mTouchFrame;   // 子View所在的矩形范围
private Scroller mScroller;
private float mLastX;   // 滑动过程中记录上次触碰点X
private float mFirstX, mFirstY; // 首次触碰范围
private boolean mIsSlide;   // 是否滑动子View
private ViewGroup mFlingView;   // 触碰的子View
private int mPosition;  // 触碰的view的位置
private int mMenuViewWidth;    // 菜单按钮宽度

public SlideRecyclerView(Context context) {
    this(context, null);
}

public SlideRecyclerView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, 0);
}

public SlideRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    mScroller = new Scroller(context);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
    int x = (int) e.getX();
    int y = (int) e.getY();
    obtainVelocity(e);
    switch (e.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (!mScroller.isFinished()) {  // 如果动画还没停止,则立即终止动画
                mScroller.abortAnimation();
            }
            mFirstX = mLastX = x;
            mFirstY = y;
            mPosition = pointToPosition(x, y);  // 获取触碰点所在的position
            if (mPosition != INVALID_POSITION) {
                View view = mFlingView;
                // 获取触碰点所在的view
                mFlingView = (ViewGroup) getChildAt(mPosition - ((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition());
                // 这里判断一下如果之前触碰的view已经打开,而当前碰到的view不是那个view则立即关闭之前的view,此处并不需要担动画没完成冲突,因为之前已经abortAnimation
                if (view != null && 
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值