圖示為等寬格子佈局,帶灰色細分割線。核心需求:
RecyclerView rv = findViewById(R.id.rv_grid);
rv.setLayoutManager(new GridLayoutManager(this, 4)); // 4 列
rv.setAdapter(new GridAdapter(dataList));
Item 佈局 item_grid.xml:
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:padding="12dp">
<ImageView android:id="@+id/iv_icon"
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/ic_launcher" />
<TextView android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="標題"
android:textSize="12sp"
android:textColor="#333" />
</LinearLayout>
分割線通過 ItemDecoration 繪製:
rv.addItemDecoration(new RecyclerView.ItemDecoration() {
private final Drawable divider = ContextCompat.getDrawable(ctx, R.drawable.divider_grid);
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int pos = parent.getChildAdapterPosition(view);
int spanCount = 4;
boolean isRightEdge = (pos + 1) % spanCount == 0;
boolean isBottomEdge = pos >= parent.getAdapter().getItemCount() - spanCount;
outRect.set(0, 0, isRightEdge ? 0 : 1, isBottomEdge ? 0 : 1); // 右、下留 1px 畫分割線
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
// 也可在這裡統一畫線,配合 divider drawable
}
});
res/drawable/divider_grid.xml:
<shape xmlns:android="https://schemas.android.com/apk/res/android">
<size android:width="1px" android:height="1px" />
<solid android:color="#D8D8D8" />
</shape>
GridView 簡單但難控制分割線樣式、不支援動畫。TableLayout 需手動添加行/列,代碼冗長,不推薦新專案使用。int spanCount = (int) (screenWidthDp / 80); // 每格約 80dp
rv.setLayoutManager(new GridLayoutManager(this, Math.max(2, spanCount)));
RecyclerView + GridLayoutManager + ItemDecoration 是現代 Android 實現格子佈局的標準方案,靈活、高效、易擴展。