web-dev-qa-db-ja.com

RecyclerViewでアイテムを水平方向に中央揃え(GridLayoutManagerを使用)

RecyclerViewの各行のすべてのアイテムを水平方向に中央揃えしようとしています

私は多くのことを試しました:RelativeLayoutを親として使用し、次にlayout_centerInParentを使用し、基本的なAndroid:layout_gravity = "center"を使用し、重みを使用してスペース要素を追加してみてください.... in item_row.xml
しかし、私は成功しませんでした:(

私が持っているもの

a busy cat

欲しいもの

a busy cat

活動中

recyclerView.setLayoutManager(new GridLayoutManager(this, 3));

item_row.xml

<Android.support.v7.widget.CardView xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/cardView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
card_view:cardCornerRadius="2dp"
card_view:cardElevation="4dp"
card_view:cardUseCompatPadding="true">

<!--   Recycler View Item Row   -->
<LinearLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="vertical">


    <ImageView
        Android:id="@+id/imgThumbnail"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:adjustViewBounds="true"
        Android:background="@Android:color/black" />

    <LinearLayout
        Android:orientation="vertical"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">


        <TextView
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:textAppearance="?android:attr/textAppearanceMedium"
            Android:text="item name"
            Android:id="@+id/txtName"
            Android:layout_margin="5dp"
            Android:singleLine="false"
            Android:lines="2"
            Android:gravity="center" />

        <LinearLayout
            Android:orientation="horizontal"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent">

            <TextView
                Android:layout_width="0dp"
                Android:layout_height="match_parent"
                Android:textAppearance="?android:attr/textAppearanceSmall"
                Android:id="@+id/txtCategory"
                Android:textStyle="italic"
                Android:textColor="#496fa9"
                Android:text="subtitle"
                Android:layout_weight="1"
                Android:gravity="center_vertical"
                Android:paddingLeft="10dp"
                Android:layout_gravity="center" />

            <ImageButton
                Android:id="@+id/imageButton"
                Android:layout_width="48dp"
                Android:layout_height="wrap_content"
                Android:background="@Android:color/black"
                Android:adjustViewBounds="true"
                Android:scaleType="fitCenter"
                Android:padding="8dp"/>

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

</Android.support.v7.widget.CardView>

私はたくさんグーグルでこれを見つけました answer しかし実際には、アイテムの各行に対してLinearLayoutを作成する方法がわかりません!

  • それが最善の解決策ですか?

  • 他のアイデアはありますか?

11
Ali Sherafat

spanSizeLookupを使用して、グリッドビューの幅が異なるビュー/アイテムを作成できます。そのため、空のビューで巧妙に調整して、それに応じて調整することができます。レイアウトが実際にどの程度可変であるかに応じて、より複雑または単純になる可能性があります。

参照: https://developer.Android.com/reference/Android/support/v7/widget/GridLayoutManager.SpanSizeLookup.html

図面に表示するこの特定のケースでは、次のようにします。

_GridLayoutManager lm = new GridLayoutManager(context, 6);
lm.setSpanSizeLookup(new MySizeLookup());

public static class MySizeLookup extends SpanSizeLookup {

   public int getSpanSize(int position) {
      if(position >= 0 && position <= 2) {
          return 2;
      } else if (position == 3 || position == 6) {
          return 1;
      } else {
          return 2;
      }
   }
}
_

これで、アダプターで位置3と6を空/非表示の要素にする必要があります。その余分なスペースを占有するためのnew View(context);のようなもの

4
Budius

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つのアイテムを続けて表示し、グリッドの中央に残したい場合に機能します。

要件に応じて、グリッドレイアウトマネージャーのスパンカウントを変更します。

2
Rahul Devanavar