Android RecycleView侧滑删除功能

Recyclerview实现侧滑删除功能,也可以自己修改条目布局的代码就可以实现其他菜单

上代码

MainActivity 

package com.exemple.kx.demo;


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;


public class MainActivity extends AppCompatActivity {


    private RecyclerView recyclerView;
    private RvAdapter mRvAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.rv);
        initData();
    }


    private void initData() {
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRvAdapter = new RvAdapter(this);
        recyclerView.setAdapter(mRvAdapter);
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                mRvAdapter.setScrollingMenu(null);
            }
        });
    }

}

Adapter类:

package com.exemple.kx.demo;


import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;


/**
 * Created by admin on 2018/6/29.
 */


public class RvAdapter extends RecyclerView.Adapter {
    private Context context;
    private RvSlideLayout mOpenMenu;
    private RvSlideLayout mScrollingMenu;


    public RvAdapter(Context context) {
        this.context = context;
    }


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View inflate = LayoutInflater.from(context).inflate(R.layout.item_show_phone, parent, false);
        ViewHolder viewHolder = new ViewHolder(inflate);
        return viewHolder;
    }


    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ViewHolder viewHolder = (ViewHolder) holder;
        viewHolder.mTextView.setText(position+"");
    }


    @Override
    public int getItemCount() {
        return 20;
    }


    public void setScrollingMenu(RvSlideLayout scrollingMenu) {
        mScrollingMenu = scrollingMenu;
    }


    public RvSlideLayout getScrollingMenu() {
        return mScrollingMenu;
    }


    public void closeOpenMenu() {
        if (mOpenMenu != null && mOpenMenu.isOpen()) {
            mOpenMenu.closeMenu();
            mOpenMenu = null;
        }
    }


    public void holdOpenMenu(RvSlideLayout rvSlideLayout) {
        mOpenMenu = rvSlideLayout;
    }




    class ViewHolder extends RecyclerView.ViewHolder {
        RvSlideLayout slidlayouts;
        TextView mTextView;
        Button mButton;


        public ViewHolder(View itemView) {
            super(itemView);
            slidlayouts = itemView.findViewById(R.id.slidlayout);
            mTextView = itemView.findViewById(R.id.tv);
            mButton = itemView.findViewById(R.id.btn_dele);
        }
    }

}

RvSlideLayout类:


package com.exemple.kx.demo;


import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;






public class RvSlideLayout extends HorizontalScrollView {




    //菜单占屏幕宽度比
    private static final float radio = 0.2f;
    private final int mScreenWidth;
    private final int mMenuWidth;




    private boolean once = true;
    private boolean isOpen;


    public RvSlideLayout(final Context context, AttributeSet attrs) {
        super(context, attrs);
        mScreenWidth = ScreenUtil.getScreenWidth(context);
        mMenuWidth = (int) (mScreenWidth * radio);
        setOverScrollMode(View.OVER_SCROLL_NEVER);
        setHorizontalScrollBarEnabled(false);
    }


    /**
     * 关闭菜单
     */


    public void closeMenu() {
        this.smoothScrollTo(0, 0);
        isOpen = false;
    }


    /**
     * 菜单是否打开
     */
    public boolean isOpen() {
        return isOpen;
    }




    /**
     * 获取 adapter
     */
    private RvAdapter getAdapter() {
        View view = this;
        while (true) {
            view = (View) view.getParent();
            if (view instanceof RecyclerView) {
                break;
            }
        }
        return (RvAdapter) ((RecyclerView) view).getAdapter();
    }


    /**
     * 当打开菜单时记录此 view ,方便下次关闭
     */
    private void onOpenMenu() {
        getAdapter().holdOpenMenu(this);
        isOpen = true;
    }


    /**
     * 当触摸此 item 时,关闭上一次打开的 item
     */
    private void closeOpenMenu() {
        if (!isOpen) {
            getAdapter().closeOpenMenu();
        }
    }


    /**
     * 获取正在滑动的 item
     */
    public RvSlideLayout getScrollingMenu() {
        return getAdapter().getScrollingMenu();
    }


    /**
     * 设置本 item 为正在滑动 item
     */
    public void setScrollingMenu(RvSlideLayout scrollingMenu) {
        getAdapter().setScrollingMenu(scrollingMenu);
    }




    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (once) {
            LinearLayout wrapper = (LinearLayout) getChildAt(0);
            wrapper.getChildAt(0).getLayoutParams().width = mScreenWidth;
            wrapper.getChildAt(1).getLayoutParams().width = mMenuWidth;
            once = false;
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }


    @Override
    public boolean onTouchEvent(MotionEvent ev) {


        if (getScrollingMenu() != null && getScrollingMenu() != this) {
            return false;
        }
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downTime = System.currentTimeMillis();
                closeOpenMenu();
                setScrollingMenu(this);
                break;
            case MotionEvent.ACTION_UP:
                setScrollingMenu(null);
                int scrollX = getScrollX();
                if (System.currentTimeMillis() - downTime <= 100 && scrollX == 0) {
                    if (mCustomOnClickListener != null) {
                        mCustomOnClickListener.onClick();
                    }
                    return false;
                }
                if (Math.abs(scrollX) > mMenuWidth / 2) {
                    this.smoothScrollTo(mMenuWidth, 0);
                    onOpenMenu();
                } else {
                    this.smoothScrollTo(0, 0);
                }
                return false;
        }
        return super.onTouchEvent(ev);
    }
    long downTime = 0;




    interface CustomOnClickListener {
        void onClick();
    }


    private CustomOnClickListener mCustomOnClickListener;


    void setCustomOnClickListener(CustomOnClickListener listener) {
        this.mCustomOnClickListener = listener;
    }

}

ScreenUtil类:

package com.exemple.kx.demo;


import android.content.Context;
import android.util.DisplayMetrics;
import android.view.WindowManager;




public class ScreenUtil {


    public static int getScreenWidth(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        return outMetrics.widthPixels;
    }
}

发布了25 篇原创文章 · 获赞 14 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_34650238/article/details/80908225