How to center items of a recyclerview?
AndroidAndroid LayoutAndroid RecyclerviewAndroid Problem Overview
I need to center elements in each row so they will be like in this mockup. I've been searching if there is any layout that works that way without look. items are centered in their rows.
This is how it looks now in my code.
Android Solutions
Solution 1 - Android
Make recyclerview width
to wrap_content
and its container's layout_gravity
to 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>
Solution 2 - Android
Take LinearLayout
in your RecyclerView
's item row layout then give android:layout_gravity="center"
to LinearLayout
.
For each row of images you have to take different LinearLayout
.
Here is example code:
<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>
Solution 3 - Android
Achieved with:
recyclerView.adapter = MyAdapter()
val layoutManager = FlexboxLayoutManager(context).apply {
justifyContent = JustifyContent.CENTER
alignItems = AlignItems.CENTER
flexDirection = FlexDirection.ROW
flexWrap = FlexWrap.WRAP
}
recyclerView.layoutManager = layoutManager
Solution 4 - Android
I am assuming that you are using a LinearLayoutManager
with a RecyclerView
for a ListView
-style effect. In that case, use a horizontal
LinearLayout
for each row, with android:gravity="center"
to center its contents.
Solution 5 - Android
Use FlexboxLayout
from com.google.android:flexbox
library. Note the flexwrap
and justifyContent
property values. Then, set layout_wrapBefore = true
on the view that you want to wrap the line of items before.
<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>
Solution 6 - Android
Use the gridLayoutManager = new GridLayoutManager(context,6)
and override setSpanSizeLookup
.
Example:
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;
}
}
});
This will work if you want to display 3 items in a row and remaining in the center of the grid.
Change the grid layout manager span counts accordingly your requirement.
Solution 7 - Android
you can use the new layoutManager from google [FlexLayoutManager][1] it will gives you a lot of control and flexibility over the recyclerView items
[1]: https://github.com/google/flexbox-layout "FlexLayoutManager"
Solution 8 - Android
you can add some layouts dynamically, for example:
- adapter object can be a horizontal LinearLayout
1- create a LinearLayout in java code and customize it (gravity,...)
2- add some icons to linearLayout
3- add linearLayout to your adapter
4- repeat 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
Solution 9 - Android
Currently, I think we need to write our own custom view for it because Android has not supported this feature as we expected yet.
It is the Sample I made in case someone needs it: https://github.com/mttdat/utils
(Try the CenterGridActivity.kt by adjusting Manifest file to start this activity as default)
Solution 10 - Android
Trust me, this gonna work. In your main xml file where you've put the recycler view, copy my code.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/_50sdp"
android:gravity="center">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="wrap_content"
android:layout_height="@dimen/_50sdp"/>
</LinearLayout>