首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 格子佈局實現:自定義分割線 Style 與 RecyclerView GridLayoutManager

     編輯:程式設計疑難解答

需求分析

圖示為等寬格子佈局,帶灰色細分割線。核心需求:

  • 格子數量動態、自適應螢幕寬度。
  • 格子內可放圖標+文字、或純文字。
  • 分割線統一風格、易維護。

方案一:RecyclerView + GridLayoutManager(推薦)

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>

方案二:TableLayout / GridView(舊專案兼容)

  • GridView 簡單但難控制分割線樣式、不支援動畫。
  • TableLayout 需手動添加行/列,代碼冗長,不推薦新專案使用。

進階:自適應列數

int spanCount = (int) (screenWidthDp / 80); // 每格約 80dp
rv.setLayoutManager(new GridLayoutManager(this, Math.max(2, spanCount)));

總結

RecyclerView + GridLayoutManager + ItemDecoration 是現代 Android 實現格子佈局的標準方案,靈活、高效、易擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved