引入依赖库
//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即可。