RecyclerView 实现网格布局每行4个最后一行不满4个的时候item居中
要实现RecyclerView的网格布局,每行4个item,并且最后一行不满4个item时居中显示,可以参考以下步骤:
- 首先,在布局文件中添加一个RecyclerView控件,设置其布局管理器为GridLayoutManager,并指定每行显示的列数为4。例如:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="4" />
- 在代码中,创建一个适配器类,继承自RecyclerView.Adapter,并实现必要的方法。例如:
public class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {
private List<Item> itemList;
public GridAdapter(List<Item> itemList) {
this.itemList = itemList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_grid, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Item item = itemList.get(position);
// 设置item的数据
holder.textView.setText(item.getTitle());
holder.imageView.setImageResource(item.getImageResId());
}
@Override
public int getItemCount() {
return itemList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageView);
textView = itemView.findViewById(R.id.textView);
}
}
}
- 创建一个Item类,用于存储每个item的数据。例如:
public class Item {
private String title;
private int imageResId;
public Item(String title, int imageResId) {
this.title = title;
this.imageResId = imageResId;
}
public String getTitle() {
return title;
}
public int getImageResId() {
return imageResId;
}
}
- 在Activity或Fragment中,初始化RecyclerView并设置适配器。例如:
RecyclerView recyclerView = findViewById(R.id.recyclerView);
List<Item> itemList = new ArrayList<>();
// 添加item的数据
itemList.add(new Item("Item 1", R.drawable.item1));
itemList.add(new Item("Item 2", R.drawable.item2));
itemList.add(new Item("Item 3", R.drawable.item3));
// ...
GridAdapter adapter = new GridAdapter(itemList);
recyclerView.setAdapter(adapter);
- 如果要实现最后一行不满4个item时居中显示,可以自定义一个GridLayoutManager并重写它的onLayoutChildren方法。在该方法中,判断最后一行item的数量,然后计算左右边距,使其居中显示。例如:
public class CenteredGridLayoutManager extends GridLayoutManager {
public CenteredGridLayoutManager(Context context, int spanCount) {
super(context, spanCount);
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
super.onLayoutChildren(recycler, state);
int itemCount = state.getItemCount();
if (itemCount > 0) {
int lastRowCount = itemCount % getSpanCount();
if (lastRowCount > 0 && lastRowCount < getSpanCount()) {
int paddingLeft = getPaddingLeft();
int paddingRight = getPaddingRight();
int width = getWidth() - paddingLeft - paddingRight;
int itemWidth = width / getSpanCount();
int leftMargin = (width - lastRowCount * itemWidth) / 2;
int rightMargin = width - leftMargin - lastRowCount * itemWidth;
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
if (getPosition(child) >= itemCount - lastRowCount) {
params.leftMargin = leftMargin;
params.rightMargin = rightMargin;
child.setLayoutParams(params);
}
}
}
}
}
}
- 在Activity或Fragment中,将布局管理器设置为自定义的CenteredGridLayoutManager。例如:
RecyclerView recyclerView = findViewById(R.id.recyclerView);
List<Item> itemList = new ArrayList<>();
// 添加item的数据
itemList.add(new Item("Item 1", R.drawable.item1));
itemList.add(new Item("Item 2", R.drawable.item2));
itemList.add(new Item("Item 3", R.drawable.item3));
// ...
GridAdapter adapter = new GridAdapter(itemList);
recyclerView.setLayoutManager(new CenteredGridLayoutManager(this, 4));
recyclerView.setAdapter(adapter);
这样就实现了RecyclerView的网格布局,每行4个item,并且最后一行不满4个item时居中显示
原文地址: http://www.cveoy.top/t/topic/iSbH 著作权归作者所有。请勿转载和采集!