9

GridLayoutManagerを使用してRecyclerViewを実装しました。GridLayoutManagerで実装されている場合、RecyclerView内のアイテムのセンタリング

データセット内のアイテム数に応じて、spanCountは1〜4です。項目幅はspanCountによって変化します。スパン数が4以上の場合、spanCountは4のままです。

5つのアイテムがある場合、1つのアイテムが残ります(1つの行に4つのアイテム、1つのアイテムが残ります)。画面上に、一列に表示されます。私はそれを中心にしたいと思います。

私は残った項目の余白をプログラム的に設定して、recyclerViewと個々の項目をLinearLayoutsにラップし、重力を中央に設定し、recyclerViewの重力を設定しました。

例の項目のXML:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="horizontal" 

    > 


    <RelativeLayout 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:layout_gravity="center" 
     android:id="@+id/relative" 
     /> 

</LinearLayout> 

例RecyclerViewのXML

 <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:gravity="center" 
      android:orientation="horizontal" 
      > 
      <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 

      /> 

     </LinearLayout> 

は、誰もが解決策を提案したり、から動作するように私に材料を与えることができます。

ありがとうございます。

答えて

9

GridLayoutManagerのスパン数を設定すると、各アイテムはどれほど試してみても、個々のアイテムに許容されるサイズを超えてサイズが拡大されません。これによりアイテム内のディメンション 'boxes'が許可され、ボックスのサイズは、GridLayoutManagerに設定されたスパン数に関連して、recyclerviewの高さと幅の合計で指定されます。これはまた、重力設定を使用して項目をその '箱'の外に押し出すことができないことを意味します。

アイテムのボックス/セルは、一般的に次のように計算されます:recylerviewの幅が100dpでスパンカウントが2の場合、各アイテムボックス/セルの幅は:width/spanCountになります。この場合、各ボックスの幅は50dp(100dp/spanCountOf2)になります。

アイテムが完全に100dpを占有し、100dpのスペースの中央に配置されるには、アイテムが2つのスパンを占める必要があります。つまり、幅が100dpでスパンカウントが2の場合、各アイテム幅が50dp(使用可能な2つのスパンコールのうちの1つ)に割り当てられている場合、アイテムが100dpを完全に占めるようにするには、gridLayoutManagerにX位置のアイテムが1ではなく2spanCountsを占めるように通知する必要があります。それが新たに定義されたボックス内でセンタリングまたはリサイズすることができます(ボックスサイズは、リサイクラの幅/高さとスパン数の関係になります)。

与えられたアイテムがどれくらいのスパンを占めるかを変更するには、GridLayoutManagerのsetSpanSizeLookup()を呼び出します。そして、あなたがのspanSizeを変更したい項目の位置を特定し、setSpanSizeLookup()メソッドのreturn文では、あなたはそれを使用したいスパン何を返す:

gridlayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
       @Override 
       public int getSpanSize(int position) { 
        if (position == 1) { 
         return 4; // the item in position now takes up 4 spans 
        } 
        return 1; 
       } 
      }); 
     } 

項目のspanCountを変更することにより、重力設定を使用して、項目が行ごとに合計スパン数を占める場合は、項目を中央に配置することができます。

ただし、アイテムをセンターアイテムにするには、アダプタで代替レイアウトを使用する必要があります。そのため、リサイクルアダプターのgetItemViewType()メソッドを使用して、さまざまなスパン数の設定を異なるミックスで組み合わせて使用​​しなければならない可能性があります。

+1

よく説明されています! – NightFury

関連する問題