Android侧滑删除库SwipeRecyclerView的封装

2021-01-06  本文已影响0人  奔跑的佩恩

前言

Android开发过程中,我们偶尔会用到RecyclerView列表的侧滑删除功能。今天基于侧滑删除库SwipeRecyclerView做一个简单的封装,使调用更加的简单快捷。下面就来讲讲侧滑删除帮助类——SwipeHelper的使用吧。
今天涉及以下内容:

  1. 侧滑删除库SwipeRecyclerView官网
  2. 依赖及布局中引用SwipeRecyclerView
  3. 需要做的准备工作
  4. SwipeHelper在Activity中使用
  5. 需要注意的点
  6. 效果图和项目结构图
  7. SwipeHelper源码

先来波效果图


1.gif

一. 侧滑删除库SwipeRecyclerView官网

SwipeHelper的封装基于侧滑删除库SwipeRecyclerView,大家可以在官网上找到更多详细使用方法。本篇文章是基于此库做简单封装,以便在开发过程中加快进度。详细库相关用法这里就不做介绍了。

二. 依赖及布局中引用SwipeRecyclerView

首先,需要在你 app_module对应的build.gradle中添加侧滑删除库的引用:

dependencies {
    //RecycleView侧滑删除
    implementation 'com.yanzhenjie.recyclerview:x:1.3.2'
}

然后在你的布局中引用侧滑删除列表控件SwipeRecyclerView,类似如下:

    <com.yanzhenjie.recyclerview.SwipeRecyclerView
        android:id="@+id/mRecyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="5dp"
        android:paddingStart="5dp"
        android:paddingRight="5dp"
        app:layout_constraintTop_toBottomOf="@+id/mBtnTest"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

三.需要做的准备工作

侧滑删除时边上的菜单按钮会涉及到一个宽度问题,所以你需要在res/values/dimen.xml文件中(若dimen.xml文件不存在,则需要自己创建)添加以下属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="dp_70">70dp</dimen>
    //其他属性省略
    //......
</resources>

四. SwipeHelper在Activity中使用

列表展示的话,肯定少不了适配器了,下面贴出适配器MyAdapter源码:

public class MyAdapter<T> extends RecyclerView.Adapter{

    public static final int DEFAULT_INDEX=-1;

    private Context mContext;
    private List<T>mData;
    private HolderView mHolderView;
    protected OnRecyclerItemClickListener mOnRecyclerItemClickListener;

    public MyAdapter(Context context,List<T>data){
        this.mContext=context;
        this.mData=data;
    }

    public void setOnRecyclerItemClickListener(OnRecyclerItemClickListener onRecyclerItemClickListener){
        this.mOnRecyclerItemClickListener=onRecyclerItemClickListener;
    }

    @Override
    public int getItemCount() {
        return mData!=null?mData.size():0;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater mInflater = LayoutInflater.from(mContext);

        View v = mInflater.inflate(R.layout.item_myadapter, parent, false);
        mHolderView = new HolderView(v);
        return mHolderView;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        String bean = mData.get(position).toString();

        mHolderView.mTvName.setText(StringUtil.isEmptyShow(bean));

        //点击事件
        mHolderView.mConstraintLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mOnRecyclerItemClickListener!=null){
                    mOnRecyclerItemClickListener.onRecyclerClick(view,position);
                }
            }
        });
    }

    public void setRecyclerManager(RecyclerView recyclerView){
        LinearLayoutManager layoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);
        layoutManager.setSmoothScrollbarEnabled(true);
        layoutManager.setAutoMeasureEnabled(true);
        recyclerView.setNestedScrollingEnabled(false);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(this);
    }


    public interface OnRecyclerItemClickListener {
        void onRecyclerClick(View view, int position);
    }
}

涉及到HolderView代码如下:

public class HolderView extends RecyclerView.ViewHolder{

    public ConstraintLayout mConstraintLayout;
    public TextView mTvName;
    public TextView mTvAddress;

    public HolderView(View itemView) {
        super(itemView);

        mConstraintLayout=itemView.findViewById(R.id.cl);
        mTvName=itemView.findViewById(R.id.tv_name);
        mTvAddress=itemView.findViewById(R.id.tv_adress);
    }
}

然后适配器的布局item_myadapter.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/cl"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    tools:context=".MainActivity">


    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="30dp"
        android:text="TextView"
        android:textColor="#000000"
        android:textSize="16sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/tv_adress"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintHorizontal_chainStyle="spread_inside"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_adress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="30dp"
        android:text="TextView"
        android:textColor="#000000"
        android:textSize="16sp"
        android:gravity="center_vertical|right"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/tv_name"
        app:layout_constraintTop_toTopOf="@+id/tv_name" />
</androidx.constraintlayout.widget.ConstraintLayout>

最后看看SwipeHelperTempActivity中的使用:

public class TempActivity extends AppCompatActivity{

    private TextView mTvTest;
    private Button mBtnTest;
    private SwipeRecyclerView mRecyclerView;

    private List<String>mTestList;
    private MyAdapter<String>myAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_temp);

        //初始化控件
        initView();
        //初始化数据
        initData();
        //控件监听
        setListener();
    }

    /**初始化控件**/
    private void initView(){
        mTvTest=findViewById(R.id.mTvTest);
        mBtnTest=findViewById(R.id.mBtnTest);
        mRecyclerView=findViewById(R.id.mRecyclerView);
    }

    private void initData(){
        SwipeHelper swipeHelper=new SwipeHelper();
        //侧滑删除的设置(必须在初始化列表前调用,否则会报错)
        swipeHelper.setBackgroundColor(R.color.colorPrimary) //设置侧滑菜单按钮背景色,默认为 R.color.red
                .setImageId(0) //设置侧滑菜单按钮设置图片id,值为0时表示不设置
                .setText("删除") //设置为null时表示不设置文字,默认为 “删除”
                .setTextColor(Color.YELLOW) //设置为0时表示不设置文字颜色,默认为白色
                .initSwipeRecyclerView(mRecyclerView, TempActivity.this, new SwipeHelper.OnSwipeListener() {
                    @Override
                    public void swipe(int position) {
                        String item = mTestList.get(position);
                        ToastUtil.shortShow("======删除===" + item);
                    }
                });

        mTestList=new ArrayList<>();
        mTestList.add("我");
        mTestList.add("是");
        mTestList.add("中国");
        mTestList.add("人");
        myAdapter=new MyAdapter<>(TempActivity.this,mTestList);
        myAdapter.setRecyclerManager(mRecyclerView);
    }

    /**控件监听**/
    private void setListener() {
        mBtnTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 test();
            }
        });

    }

    private void test(){

    }

}

五.需要注意的点

需要注意的是, SwipeHelper关于侧滑删除的设置必须在初始化列表前调用,否则会报错。

六.效果图和项目结构图

效果图.gif
项目结构图.png

七. SwipeHelper源码

下面给出SwipeHelper源码:

上一篇下一篇

猜你喜欢

热点阅读