RecyclerView下拉刷新&上拉加载更多&侧滑删除

引入依赖库

//recyclerview列表库
implementation 'androidx.recyclerview:recyclerview:1.2.1'
//刷新库
implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.2'
//BRVAH适配器库
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50'
//侧滑删除库
implementation 'com.github.mcxtzhang:SwipeDelMenuLayout:V1.3.0'
//cardview卡片布局库
implementation 'androidx.cardview:cardview:1.0.0'

添加Java1.8和viewBinding支持

compileOptions {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
}

viewBinding {
    enabled = true
}

刷新和加载更多布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.scwang.smartrefresh.layout.SmartRefreshLayout
        android:id="@+id/srl"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </com.scwang.smartrefresh.layout.SmartRefreshLayout>
</LinearLayout>

item侧滑删除布局

<?xml version="1.0" encoding="utf-8"?>
<com.mcxtzhang.swipemenulib.SwipeMenuLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="2dp"
    android:background="@color/colorWhite">

    <TextView
        android:id="@+id/tvData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:text="数据"
        android:textColor="@color/colorBlack" />

    <TextView
        android:id="@+id/tvDelete"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="@color/colorRed"
        android:gravity="center"
        android:paddingStart="20dp"
        android:paddingEnd="20dp"
        android:text="删除"
        android:textColor="@color/colorWhite"
        android:textSize="15sp" />
</com.mcxtzhang.swipemenulib.SwipeMenuLayout>

暂无数据布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暂无数据"
        android:textColor="@color/colorBlack" />
</LinearLayout>

自定义Dialog弹窗

Dialog dialog = new Dialog(MainActivity.this);
dialog.show();
Window window = dialog.getWindow();
int width = getResources().getDisplayMetrics().widthPixels;
int height = getResources().getDisplayMetrics().heightPixels;
if (window != null) {
    window.setLayout(width - 40, height);
    window.setBackgroundDrawable(new ColorDrawable(0));
    window.setContentView(R.layout.dialog_view);
    TextView tvDialogTitle = window.findViewById(R.id.tvDialogTitle);
    TextView tvDialogContent = window.findViewById(R.id.tvDialogContent);
    TextView tvDialogCancel = window.findViewById(R.id.tvDialogCancel);
    TextView tvDialogConfirm = window.findViewById(R.id.tvDialogConfirm);
    //标题
    tvDialogTitle.setText("温馨提示");
    //内容
    tvDialogContent.setText("确定删除本条内容吗");
    //取消
    tvDialogCancel.setOnClickListener(v12 -> dialog.dismiss());
    //确定
    tvDialogConfirm.setOnClickListener(v1 -> {
        dialog.dismiss();
        remove(position);
    });
}

弹窗布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    app:cardCornerRadius="8dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tvDialogTitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="10dp"
            android:textColor="@color/colorBlack"
            android:textSize="18sp" />

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorGray" />

        <androidx.core.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tvDialogContent"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:paddingStart="10dp"
                    android:paddingTop="15dp"
                    android:paddingEnd="10dp"
                    android:paddingBottom="15dp"
                    android:textColor="@color/colorBlack"
                    android:textSize="16sp" />
            </LinearLayout>
        </androidx.core.widget.NestedScrollView>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorGray" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/tvDialogCancel"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:paddingTop="15dp"
                android:paddingBottom="15dp"
                android:text="取消" />

            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@color/colorGray" />

            <TextView
                android:id="@+id/tvDialogConfirm"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:paddingTop="15dp"
                android:paddingBottom="15dp"
                android:text="确认"
                android:textColor="@color/colorBlack" />
        </LinearLayout>
    </LinearLayout>
</androidx.cardview.widget.CardView>

主要代码

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        initView();
        initData();
    }

    private void initView() {

    }

    private List<String> list = new ArrayList<>();

    private void getData() {
        for (int i = 0; i < 15; i++) {
            list.add("第" + (i + 1) + "条数据");
        }
    }

    private void initData() {
        getData();

        BaseRVAdapter<String> adapter = new BaseRVAdapter<String>(R.layout.item) {
            @SuppressLint("ClickableViewAccessibility")
            @Override
            public void onBindVH(BaseRVHolder holder, String data, int position) {
                TextView tvData = holder.getView(R.id.tvData);
                TextView tvDelete = holder.getView(R.id.tvDelete);

                tvData.setText(data);

                //删除
                tvDelete.setOnClickListener(v -> {
                    Dialog dialog = new Dialog(MainActivity.this);
                    dialog.show();
                    Window window = dialog.getWindow();
                    int width = getResources().getDisplayMetrics().widthPixels;
                    int height = getResources().getDisplayMetrics().heightPixels;
                    if (window != null) {
                        window.setLayout(width - 40, height);
                        window.setBackgroundDrawable(new ColorDrawable(0));
                        window.setContentView(R.layout.dialog_view);

                        TextView tvDialogTitle = window.findViewById(R.id.tvDialogTitle);
                        TextView tvDialogContent = window.findViewById(R.id.tvDialogContent);
                        TextView tvDialogCancel = window.findViewById(R.id.tvDialogCancel);
                        TextView tvDialogConfirm = window.findViewById(R.id.tvDialogConfirm);
                        //标题
                        tvDialogTitle.setText("温馨提示");
                        //内容
                        tvDialogContent.setText("确定删除本条内容吗");
                        //取消
                        tvDialogCancel.setOnClickListener(v12 -> dialog.dismiss());
                        //确定
                        tvDialogConfirm.setOnClickListener(v1 -> {
                            dialog.dismiss();
                            remove(position);
                        });
                    }
                });
            }
        };

        View empty = LayoutInflater.from(this).inflate(R.layout.layout_no_data, null, false);
        adapter.setEmptyView(empty);

        binding.rv.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));
        binding.rv.setAdapter(adapter);
        adapter.setNewData(list);

        //刷新
        binding.srl.setOnRefreshListener(refreshLayout -> {
            if (list != null && list.size() > 0) {
                list.clear();
            }
            getData();

            //设置数据
            adapter.setNewData(list);

            //结束刷新
            binding.srl.finishRefresh();
        });

        //加载更多
        binding.srl.setOnLoadMoreListener(refreshLayout -> {
            //添加数据
            for (int i = 0; i < 5; i++) {
                adapter.addData("我是新加载数据");
            }

            //结束加载更多
            binding.srl.finishLoadMore();
        });
    }
}

BaseRVAdapter基类

/**
 * RecyclerView Adapter的基类
 */
public abstract class BaseRVAdapter<T> extends BaseQuickAdapter<T, BaseRVHolder> {

    public BaseRVAdapter(int layoutResId) {
        super(layoutResId);
    }

    @Override
    public void onBindViewHolder(BaseRVHolder holder, int position) {
        super.onBindViewHolder(holder, position);
    }

    @Override
    protected void convert(BaseRVHolder helper, T item) {
        onBindVH(helper, item, helper.getLayoutPosition() - getHeaderLayoutCount());
    }

    public abstract void onBindVH(final BaseRVHolder holder, T data, int position);

    protected void setCheckedChange(CompoundButton cb, final int position) {
        cb.setOnCheckedChangeListener((buttonView, isChecked) -> {
            if (onViewCheckedChangeListener != null) {
                onViewCheckedChangeListener.onViewCheckedChanged(buttonView, isChecked, position);
            }
        });
    }

    public OnViewCheckedChangeListener onViewCheckedChangeListener;

    public void setOnViewCheckedChangeListener(OnViewCheckedChangeListener onViewCheckedChangeListener) {
        this.onViewCheckedChangeListener = onViewCheckedChangeListener;
    }

    public interface OnViewCheckedChangeListener {
        void onViewCheckedChanged(CompoundButton buttonView, boolean isChecked, int position);
    }

    public void removeAllData(Collection<? extends T> datas) {
        mData.removeAll(datas);
        notifyDataSetChanged();
    }
}
/**
 * ViewHolder基类 封装
 */
public class BaseRVHolder extends BaseViewHolder {

    public BaseRVHolder(View view) {
        super(view);
    }

    public <T extends View> T $(int id) {
        return getView(id);
    }

    @Override
    public BaseRVHolder setVisible(@IdRes int viewId, boolean visible) {
        View view = getView(viewId);
        view.setVisibility(visible ? View.VISIBLE : View.GONE);
        return this;
    }

    public BaseRVHolder setSelected(@IdRes int viewId, boolean selected) {
        View view = getView(viewId);
        view.setSelected(selected);
        return this;
    }

    @Override
    public BaseRVHolder setText(int viewId, CharSequence value) {
        return (BaseRVHolder) super.setText(viewId, value);
    }

    @Override
    public BaseRVHolder setText(int viewId, int strId) {
        return (BaseRVHolder) super.setText(viewId, strId);
    }

    @Override
    public BaseRVHolder setImageResource(int viewId, int imageResId) {
        return (BaseRVHolder) super.setImageResource(viewId, imageResId);
    }

    @Override
    public BaseRVHolder setBackgroundColor(int viewId, int color) {
        return (BaseRVHolder) super.setBackgroundColor(viewId, color);
    }

    @Override
    public BaseRVHolder setBackgroundRes(int viewId, int backgroundRes) {
        return (BaseRVHolder) super.setBackgroundRes(viewId, backgroundRes);
    }

    @Override
    public BaseRVHolder setTextColor(int viewId, int textColor) {
        return (BaseRVHolder) super.setTextColor(viewId, textColor);
    }

    @Override
    public BaseRVHolder setImageDrawable(int viewId, Drawable drawable) {
        return (BaseRVHolder) super.setImageDrawable(viewId, drawable);
    }

    @Override
    public BaseRVHolder setImageBitmap(int viewId, Bitmap bitmap) {
        return (BaseRVHolder) super.setImageBitmap(viewId, bitmap);
    }

    @Override
    public BaseRVHolder setAlpha(int viewId, float value) {
        return (BaseRVHolder) super.setAlpha(viewId, value);
    }

    @Override
    public BaseRVHolder setGone(int viewId, boolean visible) {
        return (BaseRVHolder) super.setGone(viewId, visible);
    }

    @Override
    public BaseRVHolder linkify(int viewId) {
        return (BaseRVHolder) super.linkify(viewId);
    }

    @Override
    public BaseRVHolder setTypeface(int viewId, Typeface typeface) {
        return (BaseRVHolder) super.setTypeface(viewId, typeface);
    }

    @Override
    public BaseRVHolder setTypeface(Typeface typeface, int... viewIds) {
        return (BaseRVHolder) super.setTypeface(typeface, viewIds);
    }

    @Override
    public BaseRVHolder setProgress(int viewId, int progress) {
        return (BaseRVHolder) super.setProgress(viewId, progress);
    }

    @Override
    public BaseRVHolder setProgress(int viewId, int progress, int max) {
        return (BaseRVHolder) super.setProgress(viewId, progress, max);
    }

    @Override
    public BaseRVHolder setMax(int viewId, int max) {
        return (BaseRVHolder) super.setMax(viewId, max);
    }

    @Override
    public BaseRVHolder setRating(int viewId, float rating) {
        return (BaseRVHolder) super.setRating(viewId, rating);
    }

    @Override
    public BaseRVHolder setRating(int viewId, float rating, int max) {
        return (BaseRVHolder) super.setRating(viewId, rating, max);
    }

    @Override
    public BaseRVHolder setOnClickListener(int viewId, View.OnClickListener listener) {
        return (BaseRVHolder) super.setOnClickListener(viewId, listener);
    }

    public BaseRVHolder addOnClickListener(int viewId) {
        return (BaseRVHolder) super.addOnClickListener(viewId);
    }

    public BaseRVHolder setNestView(int viewId) {
        return (BaseRVHolder) super.setNestView(viewId);
    }

    public BaseRVHolder addOnLongClickListener(int viewId) {
        return (BaseRVHolder) super.addOnLongClickListener(viewId);
    }

    @Override
    public BaseRVHolder setOnTouchListener(int viewId, View.OnTouchListener listener) {
        return (BaseRVHolder) super.setOnTouchListener(viewId, listener);
    }

    @Override
    public BaseRVHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) {
        return (BaseRVHolder) super.setOnLongClickListener(viewId, listener);
    }

    @Override
    public BaseRVHolder setOnItemClickListener(int viewId, AdapterView.OnItemClickListener listener) {
        return (BaseRVHolder) super.setOnItemClickListener(viewId, listener);
    }

    @Override
    public BaseRVHolder setOnItemLongClickListener(int viewId, AdapterView.OnItemLongClickListener listener) {
        return (BaseRVHolder) super.setOnItemLongClickListener(viewId, listener);
    }

    @Override
    public BaseRVHolder setOnItemSelectedClickListener(int viewId, AdapterView.OnItemSelectedListener listener) {
        return (BaseRVHolder) super.setOnItemSelectedClickListener(viewId, listener);
    }

    @Override
    public BaseRVHolder setOnCheckedChangeListener(int viewId, CompoundButton.OnCheckedChangeListener listener) {
        return (BaseRVHolder) super.setOnCheckedChangeListener(viewId, listener);
    }

    @Override
    public BaseRVHolder setTag(int viewId, Object tag) {
        return (BaseRVHolder) super.setTag(viewId, tag);
    }

    @Override
    public BaseRVHolder setTag(int viewId, int key, Object tag) {
        return (BaseRVHolder) super.setTag(viewId, key, tag);
    }

    @Override
    public BaseRVHolder setChecked(int viewId, boolean checked) {
        return (BaseRVHolder) super.setChecked(viewId, checked);
    }

    @Override
    public BaseRVHolder setAdapter(int viewId, Adapter adapter) {
        return (BaseRVHolder) super.setAdapter(viewId, adapter);
    }

    @Override
    protected BaseRVHolder setAdapter(BaseQuickAdapter adapter) {
        return (BaseRVHolder) super.setAdapter(adapter);
    }
}

MyApplication初始化加载和刷新样式

public class MyApplication extends Application {
    //static 代码段可以防止内存泄露
    static {
        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator((context, layout) -> {
            //指定为经典Header,默认是 贝塞尔雷达Header
            return new ClassicsHeader(context).setSpinnerStyle(SpinnerStyle.Translate);
        });
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator((context, layout) -> {
            //指定为经典Footer,默认是 BallPulseFooter
            return new ClassicsFooter(context).setSpinnerStyle(SpinnerStyle.Translate);
        });
    }
}

配置文件的application中引入MyApplication即可。

猜你喜欢

转载自blog.csdn.net/juer2017/article/details/130090050