1.导入依赖
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.35'
2.写一个Layout布局装载RecyclerView
<?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"
android:background="#F2F1F6"
style="@style/xxx">
<!-- 标题栏 -->
<RelativeLayout android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/dimen_titltbar_height"
android:layout_gravity="center_vertical"
android:background="@drawable/xxx">
<ImageView
android:id="@+id/backhome"
style="@style/xxx" />
<TextView
android:id="@+id/nfctitle"
style="@style/aj_new_title_bar_title_text"
android:text="@string/xxx" />
</RelativeLayout>
<Button
android:id="@+id/test_btn"
android:text="测试"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<!-- 正文 -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/product_rv"
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
3.Acitivity
public class AllActivity extends AppCompatActivity {
private Disposable subscribe;
RecyclerView product_rv;
@AllArgsConstructor
public static class Args {
int[] viewIdArray;
String[] moduleNames;
AutoDto[][] autoDtos;
}
private final static String TAG = "AllActivity";
ImageView backhome;
Button button;
private Unbinder bind;
@SuppressLint("CheckResult")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
backhome = findViewById(R.id.backhome);
product_rv = findViewById(R.id.product_rv);
button = findViewById(R.id.test_btn);
subscribe = Observable.fromCallable(() -> {
List<ProductCateDto> productList = new LinkedList<>();
return productList;
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<ProductCateDto>>() {
@Override
public void accept(List<ProductCateDto> productCateDtos) throws Exception {
GridRecyclerAdapter adapter = new GridRecyclerAdapter(AllActivity.this, productCateDtos);
GridSpacingItemDecoration gridSpacingItemDecoration = new GridSpacingItemDecoration( 13, true);
//Grid布局
GridLayoutManager gridLayoutManager = new GridLayoutManager(AllActivity.this, 4);
product_rv.setLayoutManager(gridLayoutManager);//这里用线性宫格显示 类似于grid view
product_rv.setAdapter(adapter);
product_rv.addItemDecoration(gridSpacingItemDecoration);
product_rv.setClipToPadding(false);
DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
defaultItemAnimator.setAddDuration(1000);
defaultItemAnimator.setRemoveDuration(1000);
product_rv.setItemAnimator(defaultItemAnimator);
/**
* 设置item所占的格子
*/
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return adapter.isHeader(position) ? gridLayoutManager.getSpanCount() : 1;
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//自己随便设一个随机集合
List<ProductCateDto> list = Arrays.asList();
Random random = new Random();
int i = random.nextInt(2);
ProductCateDto productCateDto1 = list.get(i);
LinkedList<ProductCateDto> productCateDtos2 = new LinkedList<>(productCateDtos);
productCateDtos2.addFirst(productCateDto1);
adapter.updateList(productCateDtos2);
}
});
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e("TAG", "accept: " + throwable.getMessage());
}
});
init();
}
public void init() {
backhome.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(AllActivity.this, Activity_other.class);
startActivity(intent);
startAini(true);
finish();
}
});
}
/**
* Intent Switching animation
*
* @param flag
*/
public void startAini(boolean flag) {
if (flag) {
overridePendingTransition(R.anim.push_right_in,
R.anim.push_right_out);
} else {
overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("onDestroy");
if (bind != null) {
//解绑视图
bind.unbind();
}
if (subscribe != null) {
subscribe.dispose();
}
}
}
4.RecyclerView适配器
public class GridRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final Integer HEADER = 0;
public static final Integer BODY = 1;
private Activity context;
List<ProductCateDto> productCateDtoList;
public boolean isHeader(int position) {
return productCateDtoList.get(position).getType().equals(HEADER);
}
public void updateList(List<ProductCateDto> newList) {
MyDiffCallback<ProductCateDto> diffCallback = new MyDiffCallback<>(this.productCateDtoList, newList);
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
this.productCateDtoList.clear();
this.productCateDtoList.addAll(newList);
diffResult.dispatchUpdatesTo(this);
}
@Override
public int getItemViewType(int position) {
ProductCateDto productCateDto = productCateDtoList.get(position);
return productCateDto.getType();
}
public GridRecyclerAdapter(Activity context, List<ProductCateDto> productCateDtoList) {
this.context = context;
this.productCateDtoList = productCateDtoList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View inflate;
if (viewType == HEADER) {
inflate = LayoutInflater.from(context).inflate(R.layout.layout_product_category_header, parent, false);
return new HeaderViewHolder(inflate);
} else {
inflate = LayoutInflater.from(context).inflate(R.layout.jmy_grid_item, parent, false);
return new BodyViewHolder(inflate);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ProductCateDto productCateDto = productCateDtoList.get(position);
Integer type = productCateDto.getType();
if (type.equals(HEADER)) {
HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
headerViewHolder.title_tv.setText(productCateDto.getHeaderName());
} else {
BodyViewHolder bodyViewHolder = (BodyViewHolder) holder;
bodyViewHolder.iv.setImageResource(productCateDto.getImage());
bodyViewHolder.tv.setText(productCateDto.getName());
bodyViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Handle item click
Intent intent = new Intent(context, productCateDto.getAClass());
context.startActivity(intent);
startAini(false);
context.finish();
}
});
}
}
/**
* Intent Switching animation
*
* @param flag
*/
public void startAini(boolean flag) {
if (flag) {
context.overridePendingTransition(R.anim.push_right_in,
R.anim.push_right_out);
} else {
context.overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
}
}
@Override
public int getItemCount() {
return productCateDtoList.size();
}
public static class HeaderViewHolder extends RecyclerView.ViewHolder {
TextView title_tv;
public HeaderViewHolder(@NonNull View itemView) {
super(itemView);
title_tv = itemView.findViewById(R.id.title_tv);
}
}
public static class BodyViewHolder extends RecyclerView.ViewHolder {
ImageView iv;
TextView tv;
public BodyViewHolder(@NonNull View itemView) {
super(itemView);
iv = itemView.findViewById(R.id.iv_item);
tv = itemView.findViewById(R.id.tv_item);
}
}
}
5.自动调整item间距
public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {
private int spanCount;
private int spacing;
private boolean includeEdge;
public GridSpacingItemDecoration(int spacing, boolean includeEdge) {
this.spacing = spacing;
this.includeEdge = includeEdge;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view); // item position
RecyclerView.Adapter adapter = parent.getAdapter();
int itemViewType = adapter.getItemViewType(position);
if (itemViewType==GridRecyclerAdapter.HEADER){
spanCount=4;
}else {
spanCount=1;
}
int column = position % spanCount; // item column
if (includeEdge) {
outRect.left = spacing - column * spacing / spanCount;
outRect.right = (column + 1) * spacing / spanCount;
} else {
outRect.left = column * spacing / spanCount;
outRect.right = spacing - (column + 1) * spacing / spanCount;
}
}
}
6.BaseEntity
import lombok.Getter;
import lombok.Setter;
public class BaseEntity {
@Getter
@Setter
private String id;
}
都是代码,不解释了