このモックアップのように各要素を中央に配置する必要があります。見ずにそのように機能するレイアウトがあるかどうかを検索しました。アイテムは行の中央に配置されます。
これは私のコードでどのように見えるかです。
LinearLayout
のアイテム行レイアウトでRecyclerView
を取得し、LinearLayout
にAndroid:layout_gravity="center"
を指定します。
画像の行ごとに、異なるLinearLayout
を使用する必要があります。
コードの例を次に示します。
<LinearLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:orientation="horizontal">
<ImageView
Android:id="@+id/image1"
Android:layout_width="64dp"
Android:layout_height="64dp"
Android:layout_marginRight="10dp"
Android:layout_weight="1"
Android:src="@drawable/image1" />
<ImageView
Android:id="@+id/image2"
Android:layout_width="64dp"
Android:layout_height="64dp"
Android:layout_marginLeft="10dp"
Android:layout_marginRight="10dp"
Android:layout_weight="1"
Android:src="@drawable/image2" />
<ImageView
Android:id="@+id/image3"
Android:layout_width="64dp"
Android:layout_height="64dp"
Android:layout_marginLeft="10dp"
Android:layout_marginRight="10dp"
Android:layout_weight="1"
Android:src="@drawable/image3" />
</LinearLayout>
Recyclerviewをwidth
からwrap_content
とそのコンテナのlayout_gravity
からcenter_horizontal
に変更します
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycrer_view"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
Android:paddingLeft="16dp"
Android:paddingRight="16dp" />
</LinearLayout>
LinearLayoutManager
スタイルの効果のためにRecyclerView
とともにListView
を使用していると仮定しています。その場合、各行にhorizontal
LinearLayout
を使用し、Android:gravity="center"
を使用してコンテンツを中央揃えにします。
次のように、いくつかのレイアウトを動的に追加できます。
1- JavaコードでLinearLayoutを作成し、カスタマイズします(重力、...)
2- linearLayoutにいくつかのアイコンを追加
3-アダプタにlinearLayoutを追加します
4-リピート1,2,3
// : declare new horizontal linearLayout
ImageView myIcons[nomOfIcons];
// : add all icons to myIcons
for(int i=1; i<=nomOfIcons; i++){
linearLayout.addView(myIcons[i - 1]);
if(i%numOfIconsInOneHorizontalLinearLayout==0) {
results.add(linearLayout); // add linearLayout to adapter dataSet
// : declare new horizontal linearLayout
}
}
if(n%numOfIconsInOneHorizontalLinearLayout!=0) // add last linearLayout if not added in the loop
results.add(linearLayout);
mAdapter.notifyDataSetChanged(); // update adapter
com.google.Android:flexbox
ライブラリのFlexboxLayout
を使用します。 flexwrap
およびjustifyContent
プロパティ値に注意してください。次に、前にアイテムの行をラップするビューにlayout_wrapBefore = true
を設定します。
<com.google.Android.flexbox.FlexboxLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:flexWrap="wrap"
app:justifyContent="center">
<View ... />
<View app:layout_wrapBefore="true" ... />
<View ... />
</com.google.Android.flexbox.FlexboxLayout>
gridLayoutManager = new GridLayoutManager(context,6)
を使用し、setSpanSizeLookup
をオーバーライドします。
例:
int totalSize=list.size();
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int span;
span = totalSize % 3;
if (totalSize < 3) {
return 6;
} else if (span == 0 || (position <= ((totalSize - 1) - span))) {
return 2;
} else if (span == 1) {
return 6;
} else {
return 3;
}
}
});
これは、グリッドの中央に残り、3つのアイテムを連続して表示する場合に機能します。
グリッドレイアウトマネージャーのスパンカウントを必要に応じて変更します。
googleの新しいlayoutManagerを使用できます FlexLayoutManager これにより、recyclerViewアイテムに対する多くの制御と柔軟性が得られます。