{"title":"RecyclerView 实现网格布局,每行4个,最后一行不满4个的时候,item居中","description":"本教程详细介绍如何在 Android 中使用 RecyclerView 实现网格布局,每行显示 4 个 item,并解决最后一行不满 4 个 item 时居中显示的问题。包括布局、适配器、数据模型、自定义 GridLayoutManager 等内容,并提供代码示例。","keywords":"RecyclerView, 网格布局, GridLayoutManager, Android, 居中显示, 最后一行, 代码示例, Android 开发","content":"要实现RecyclerView的网格布局,每行4个item,并且最后一行不满4个item时居中显示,可以参考以下步骤:\n\n1. 首先,在布局文件中添加一个RecyclerView控件,设置其布局管理器为GridLayoutManager,并指定每行显示的列数为4。例如:\n\nxml\n<androidx.recyclerview.widget.RecyclerView\n android:id="@+id/recyclerView"\n android:layout_width="match_parent"\n android:layout_height="match_parent"\n app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"\n app:spanCount="4" />\n\n\n2. 在代码中,创建一个适配器类,继承自RecyclerView.Adapter,并实现必要的方法。例如:\n\njava\npublic class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {\n\n private List<Item> itemList;\n\n public GridAdapter(List<Item> itemList) {\n this.itemList = itemList;\n } \n\n @NonNull\n @Override\n public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_grid, parent, false);\n return new ViewHolder(view);\n }\n\n @Override\n public void onBindViewHolder(@NonNull ViewHolder holder, int position) {\n Item item = itemList.get(position);\n // 设置item的数据\n holder.textView.setText(item.getTitle());\n holder.imageView.setImageResource(item.getImageResId());\n }\n\n @Override\n public int getItemCount() {\n return itemList.size();\n }\n\n public class ViewHolder extends RecyclerView.ViewHolder {\n\n private ImageView imageView;\n private TextView textView;\n\n public ViewHolder(@NonNull View itemView) {\n super(itemView);\n imageView = itemView.findViewById(R.id.imageView);\n textView = itemView.findViewById(R.id.textView);\n }\n }\n}\n\n\n3. 创建一个Item类,用于存储每个item的数据。例如:\n\njava\npublic class Item {\n\n private String title;\n private int imageResId;\n\n public Item(String title, int imageResId) {\n this.title = title;\n this.imageResId = imageResId;\n }\n\n public String getTitle() {\n return title;\n }\n\n public int getImageResId() {\n return imageResId;\n }\n}\n\n\n4. 在Activity或Fragment中,初始化RecyclerView并设置适配器。例如:\n\njava\nRecyclerView recyclerView = findViewById(R.id.recyclerView);\nList<Item> itemList = new ArrayList<>();\n// 添加item的数据\nitemList.add(new Item("Item 1", R.drawable.item1));\nitemList.add(new Item("Item 2", R.drawable.item2));\nitemList.add(new Item("Item 3", R.drawable.item3));\n// ...\nGridAdapter adapter = new GridAdapter(itemList);\nrecyclerView.setAdapter(adapter);\n\n\n5. 如果要实现最后一行不满4个item时居中显示,可以自定义一个GridLayoutManager并重写它的onLayoutChildren方法。在该方法中,判断最后一行item的数量,然后计算左右边距,使其居中显示。例如:\n\njava\npublic class CenteredGridLayoutManager extends GridLayoutManager {\n\n public CenteredGridLayoutManager(Context context, int spanCount) {\n super(context, spanCount);\n }\n\n @Override\n public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {\n super.onLayoutChildren(recycler, state);\n\n int itemCount = state.getItemCount();\n if (itemCount > 0) {\n int lastRowCount = itemCount % getSpanCount();\n if (lastRowCount > 0 && lastRowCount < getSpanCount()) {\n int paddingLeft = getPaddingLeft();\n int paddingRight = getPaddingRight();\n int width = getWidth() - paddingLeft - paddingRight;\n int itemWidth = width / getSpanCount();\n\n int leftMargin = (width - lastRowCount * itemWidth) / 2;\n int rightMargin = width - leftMargin - lastRowCount * itemWidth;\n\n for (int i = 0; i < getChildCount(); i++) {\n View child = getChildAt(i);\n RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();\n if (getPosition(child) >= itemCount - lastRowCount) {\n params.leftMargin = leftMargin;\n params.rightMargin = rightMargin;\n child.setLayoutParams(params);\n }\n }\n }\n }\n }\n}\n\n\n6. 在Activity或Fragment中,将布局管理器设置为自定义的CenteredGridLayoutManager。例如:\n\njava\nRecyclerView recyclerView = findViewById(R.id.recyclerView);\nList<Item> itemList = new ArrayList<>();\n// 添加item的数据\nitemList.add(new Item("Item 1", R.drawable.item1));\nitemList.add(new Item("Item 2", R.drawable.item2));\nitemList.add(new Item("Item 3", R.drawable.item3));\n// ...\nGridAdapter adapter = new GridAdapter(itemList);\nrecyclerView.setLayoutManager(new CenteredGridLayoutManager(this, 4));\nrecyclerView.setAdapter(adapter);\n\n\n这样就实现了RecyclerView的网格布局,每行4个item,并且最后一行不满4个item时居中显示。

Android RecyclerView 实现网格布局:每行4个,最后一行不满居中显示

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

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