要实现RecyclerView的网格布局,每行4个item,并且最后一行不满4个item时居中显示,可以参考以下步骤:

  1. 首先,在布局文件中添加一个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" />
  1. 在代码中,创建一个适配器类,继承自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);
        }
    }
}
  1. 创建一个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;
    }
}
  1. 在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);
  1. 如果要实现最后一行不满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);
                    }
                }
            }
        }
    }
}
  1. 在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时居中显示

RecyclerView 实现网格布局每行4个最后一行不满4个的时候item居中

原文地址: http://www.cveoy.top/t/topic/iSbH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录