How can I fill RecyclerView with GridLayoutManager from right to left
Asked Answered
M

5

33

I'm trying to fill some data into a RecyclerView with GridLayoutManager:

GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);

This will fill the data into the grid from left to right. The first item will be put into top-left place, etc.

But the app I'm developing is designed for an RTL language, so I need to make it fill from right to left.

I tried to change the last argument to true. But it just scrolled the RecyclerView all the way down.

Also setting layoutDirection attribute for RecyclerView doesn't work (without considering that my min API is 16 and this attribute is added for API17+):

<android.support.v7.widget.RecyclerView
        android:id="@+id/grid"
        android:layoutDirection="rtl"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

How can I create a right to left filled grid using RecyclerView?

Maund answered 3/10, 2015 at 9:15 Comment(4)
Kindly try using android:rotationY="180" firstEcholalia
you can achieve this by animation..Shotwell
please check this answer: linkBello
Possible duplicate of #31729337Corpuscle
G
78

Create a class that extends GridLayoutMAnager ,and override the isLayoutRTL() method like this:

public class RtlGridLayoutManager extends GridLayoutManager {

    public RtlGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    public RtlGridLayoutManager(Context context, int spanCount) {
        super(context, spanCount);
    }

    public RtlGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
        super(context, spanCount, orientation, reverseLayout);
    }

    @Override
    protected boolean isLayoutRTL(){
        return true;
    }
}
Girth answered 5/10, 2015 at 11:13 Comment(5)
Thanks Mohammad! Solved the problem beautifully.Maund
Thanks! Actually, isLayoutRTL() is a documented protected method of GridLayoutManager, therefore this solution is forward-compatible.Ragman
Consider to use RecyclerView 24.2.0 and upper for better results. According to [GridLayoutManager documentation] (developer.android.com/reference/android/support/v7/widget/…) RTL handling is better than before. I had some issues before on calling notifyDataSetChanged().Bushido
is it safe to use? Doesn't need API 17+ ?Outgoing
thanks it worked . if we have to write class so what's the job of android:layoutDirection="rtl"?Spectrometer
M
14

The answer by Mohammad is true but you do not need to create a new class. you can simply override isLayoutRTL method.

GridLayoutManager lm = new GridLayoutManager(this, 2) {
    @Override
    protected boolean isLayoutRTL() {
        return true;
    }
};
Misread answered 14/9, 2018 at 16:28 Comment(0)
M
5

There is a better way to do it

You can programmatically change the layout direction of the RecycleView

workHourRecycler = view.findViewById(R.id.market_hours_recycler);
workHourRecycler.setLayoutManager(new GridLayoutManager(getContext(),4));

//Programtically set the direction
workHourRecycler.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
Muddleheaded answered 19/4, 2018 at 13:19 Comment(2)
It works fine, you juste have to call ViewCompat.setLayoutDirection(workHourRecycler, View. LAYOUT_DIRECTION_RTL)Marutani
ViewCompat.setLayoutDirection(View, int) does nothing on api < 17. Using ViewCompat just makes it so it doesn't throw an exception on api levels that doesn't support it.Dolores
R
1

On the face of it, GridLayouManager should fill rows from right when getLayoutDirection() gives ViewCompat.LAYOUT_DIRECTION_RTL. Normally, this direction will be inherited from the RecyclerView's container.

But if this does not work as expected, or you need to push it down to API 16, or you some device with bad implementation of RTL support, you can simply pull the GridLayoutManager from github, and use a custom manager that you tune to your liking.

It may be enough to extend the stock GridLayoutManager and override layoutChunk().

Ragman answered 4/10, 2015 at 15:40 Comment(3)
I can't override it as it is package-visible. Also I couldn't find where this method is being used. But it seems promising.Maund
What can prevent you from starting your custom manager with statement package android.support.v7.widget;?Ragman
Thanks Alex. Didn't know that. It was actually very easy to bypass the issue. Thanks for the clues.Maund
S
-6

Its very simple, just call method setReverseLayout as,

GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
layoutManager.setReverseLayout(true);
Showker answered 23/11, 2015 at 9:46 Comment(1)
This will just make it upside-down!Stouthearted

© 2022 - 2024 — McMap. All rights reserved.