RecycleView左滑删除(仿QQ左滑删除)

实现原理其实很简单,主要是利用自定义HorizontalScrollView平移的方式实现,判断左滑的距离是否大于左滑显示的布局的宽度,如果是的话,则进行左滑操作,否则隐藏

 /**
     * 6.按滚动条被拖动距离判断关闭或打开菜单
     * getScrollX()                view的左上角相对于母视图的左上角的X轴偏移量
     * smoothScrollTo(x, y);        参数:相对于ScrollView左上角的位置来说,你要移动的位置
     */
    public void changeScrollx() {
        if (getScrollX() >= (mScrollWidth / 2)) {
            this.smoothScrollTo(mScrollWidth, 0);
            isOpen = true;
            mIonSlidingButtonListener.onMenuIsOpen(this);
        } else {
            this.smoothScrollTo(0, 0);
            isOpen = false;
        }
    }

好吧,这个文章我只是转载的,为了方便自己以后参考转的

下面开始直接上这个大佬写的代码,核心是这个自定义View

**
 * recycleView 左滑view
 */
public class LeftSlideView extends HorizontalScrollView {
    private Boolean once = false;//在onMeasure中只执行一次的判断
    private TextView mTextView_Delete;//删除按钮
    private int mScrollWidth;//记录滚动条可以滚动的距离
    private IonSlidingButtonListener mIonSlidingButtonListener;//自定义的接口,用于传达滑动事件等
    private Boolean isOpen = false;//记录按钮菜单是否打开,默认关闭false
    /**
     * 1.构造方法
     */
    public LeftSlideView(Context context) {
        super(context, null);
    }

    public LeftSlideView(Context context, AttributeSet attrs) {
        super(context, attrs, 0);
    }

    public LeftSlideView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.setOverScrollMode(OVER_SCROLL_NEVER);
    }

    //2.在onMeasure中先取得作为“设置”、“删除”按钮的TextView
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (!once) {
            mTextView_Delete = (TextView) findViewById(R.id.tv_delete);
            once = true;
        }
    }

    //3.在onLayout中使Item在每次变更布局大小时回到初始位置,并且获取滚动条的可移动距离
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if (changed) {
            this.scrollTo(0, 0);

            //获取水平滚动条可以滑动的范围,即右侧“设置”、“删除”按钮的总宽度
            mScrollWidth = mTextView_Delete.getWidth();
        }
    }
    //4.滑动监听,按滑动的距离大小控制菜单开关
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        super.onTouchEvent(ev);
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN://按下
            case MotionEvent.ACTION_MOVE://移动
                mIonSlidingButtonListener.onDownOrMove(this);
                break;
            case MotionEvent.ACTION_UP://松开
            case MotionEvent.ACTION_CANCEL:
                changeScrollx();
                return true;
            default:
                break;
        }
        return super.onTouchEvent(ev);
    }

    /**
     * 5.
     * @param l
     * @param t
     * @param oldl
     * @param oldt
     */
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);

        //改变view的在x轴方向的位置
        mTextView_Delete.setTranslationX(1);
    }
    /**
     * 6.按滚动条被拖动距离判断关闭或打开菜单
     * getScrollX()                view的左上角相对于母视图的左上角的X轴偏移量
     * smoothScrollTo(x, y);        参数:相对于ScrollView左上角的位置来说,你要移动的位置
     */
    public void changeScrollx() {
        if (getScrollX() >= (mScrollWidth / 2)) {
            this.smoothScrollTo(mScrollWidth, 0);
            isOpen = true;
            mIonSlidingButtonListener.onMenuIsOpen(this);
        } else {
            this.smoothScrollTo(0, 0);
            isOpen = false;
        }
    }
    /**
     * 7.打开菜单
     */
    public void openMenu() {
        if (isOpen) {
            return;
        }
        this.smoothScrollTo(mScrollWidth, 0);//相对于原来没有滑动的位置x轴方向偏移了mScrollWidth,y轴方向没有变化。
        isOpen = true;
        mIonSlidingButtonListener.onMenuIsOpen(this);
    }

    /**
     * 8.关闭菜单
     */
    public void closeMenu() {
        if (!isOpen) {
            return;
        }
        this.smoothScrollTo(0, 0);//相对于原来没有滑动的位置,x轴方向、y轴方向都没有变化,即回到原来的位置了。
        isOpen = false;
    }


    /**
     * 9.接口定义及注册方法
     */
    public void setSlidingButtonListener(IonSlidingButtonListener listener) {
        mIonSlidingButtonListener = listener;
    }
    public interface IonSlidingButtonListener {

        //该方法在Adapter中实现
        void onMenuIsOpen(View view);//判断菜单是否打开
        void onDownOrMove(LeftSlideView leftSlideView);//滑动或者点击了Item监听
    }
}

然后item中



    

        
     
      《你自己的item布局》



    




然后adapter中

public class LotteryListAdapter extends BaseQuickAdapter implements LeftSlideView.IonSlidingButtonListener{
    private IonSlidingViewClickListener mIDeleteBtnClickListener;

    private LeftSlideView mMenu = null;
    public LotteryListAdapter(int layoutResId,IonSlidingViewClickListener listener) {
        super(layoutResId);
        this.mIDeleteBtnClickListener=listener;
    }

    @Override
    protected void convert(MyViewHolder helper, itemBean item) {
        LinearLayout layout_content=helper.getView(R.id.layout_content);
        layout_content.getLayoutParams().width = SizeUtil.getScreenWidth(mContext)-SizeUtil.dp2px(mContext,20);

        layout_content.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //判断是否有删除菜单打开
                if (menuIsOpen()) {
                    closeMenu();//关闭菜单
                } else {
                    mIDeleteBtnClickListener.onItemClick(v, helper.getLayoutPosition());
                }
            }
        });
        helper.getView(R.id.tv_delete).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mIDeleteBtnClickListener.onDeleteBtnCilck(v, helper.getLayoutPosition());
            }
        });
//你们自己的item逻辑

    }
    class MyViewHolder extends BaseViewHolder{

        public MyViewHolder(View view) {
            super(view);
            ((LeftSlideView) view).setSlidingButtonListener(LotteryListAdapter.this);
        }
    }

   
    @Override
    public void onMenuIsOpen(View view) {
        LogUtil.e("左滑","onMenuIsOpen");
        mMenu = (LeftSlideView) view;
    }

    @Override
    public void onDownOrMove(LeftSlideView leftSlideView) {
        LogUtil.e("左滑","onDownOrMove");
        if (menuIsOpen()) {
            if (mMenu != leftSlideView) {
                closeMenu();
            }
        }
    }
    /**
     * 关闭菜单
     */
    public void closeMenu() {
        mMenu.closeMenu();
        mMenu = null;

    }
    /**
     * 判断菜单是否打开
     *
     * @return
     */
    public Boolean menuIsOpen() {
        if (mMenu != null) {
            return true;
        }
        return false;
    }
    /**
     * 注册接口的方法:点击事件。在Mactivity.java实现这些方法。
     */
    public interface IonSlidingViewClickListener {
        void onItemClick(View view, int position);//点击item正文
        void onDeleteBtnCilck(View view, int position);//点击“删除”
    }
}

效果如下:

参考:

RecyclerView 左滑(仿QQ左滑删除)_江小虫儿的博客-CSDN博客

你可能感兴趣的:(android进阶,android,java,开发语言)