私のAndroidアプリでは、RecyclerView
を使用してグリッド内のアイテムを表示するためにGridLayoutManager
を使用しています。GridViewでは、間隔を指定するために要素間では、horizontalSpacingおよびverticalSpacingプロパティを設定します。
それで、どのようにRecyclerView
でも同じことができますか?
GridLayoutではテストしていませんが、LinearLayoutでは、各リスト項目のルートレイアウトにマージンを設定するだけです。すべてのアイテム間で同じスペースが必要な場合(たとえば8dp)、これを行う必要があります。
この方法では、すべてのアイテムの周りに一定の8 dpがあります。
以下のコードは、8 dpの正しい間隔で画像を表示する水平なRecyclerViewです。
<!-- fragment_layout.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:padding="4dp">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycler_view"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
app:layoutManager="Android.support.v7.widget.LinearLayoutManager"
tools:listitem="@layout/list_item" />
</LinearLayout>
<!-- list_item.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_margin="4dp">
<ImageView
Android:layout_width="@dimen/thumbnail_size"
Android:layout_height="@dimen/thumbnail_size"
Android:contentDescription="@string/image_content_desc" />
</LinearLayout>
編集:アイテムビューには親ViewGroupが必要であることがわかったため、スニペットを更新しました。
そのためにItemDecorator
を使用する必要があります。
このような:
public class EqualSpaceItemDecoration extends RecyclerView.ItemDecoration {
private final int mSpaceHeight;
public EqualSpaceItemDecoration(int mSpaceHeight) {
this.mSpaceHeight = mSpaceHeight;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
outRect.bottom = mSpaceHeight;
outRect.top = mSpaceHeight;
outRect.left = mSpaceHeight;
outRect.right = mSpaceHeight;
}
}
public class EqualSpaceItemDecoration extends RecyclerView.ItemDecoration {
private final int mSpaceHeight;
public EqualSpaceItemDecoration(int mSpaceHeight) {
this.mSpaceHeight = mSpaceHeight;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
outRect.bottom = mSpaceHeight;
outRect.top = mSpaceHeight;
outRect.left = mSpaceHeight;
outRect.right = mSpaceHeight;
}
上記の答えは、画像が出会うところで不均等なマージン幅を生成します。
以下のソリューションでは、マージンも均等になります
public void getItemOffsets (Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position= parent.getChildAdapterPosition (view);
int column = position% numberOfColumns;
outRect.left= margin-column*spacingPx/numberOfColumns;
outRect.right= (column+1)* margin/numberOfColumns;
outRect.top= margin;
}
}