如何使用GridLayoutManager将RecyclerView从右到左填充?

33

我正试图使用GridLayoutManager将一些数据填充到RecyclerView中:

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

这将把数据从左到右填入网格中。第一个项目将被放置在左上角等位置。

但我正在开发的应用程序是针对RTL语言设计的,因此我需要使它从右到左填充。

我尝试将最后一个参数更改为true。但它只是滚动了整个RecyclerView

同时设置RecyclerViewlayoutDirection属性不起作用(不考虑我的最小API为16,而此属性是添加到API17+的):

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

如何使用 RecyclerView 创建一个从右到左填充的网格布局?


请先尝试使用android:rotationY="180"。 - Ivan V
你可以通过动画来实现这一点。 - Chaudhary Amar
请检查此答案: 链接 - Sajad Rahmanipour
可能是 https://dev59.com/y1wZ5IYBdhLWcg3wM97Z 的重复问题。 - javadroid
5个回答

78
创建一个继承自 GridLayoutMAnager 的类,并重写 isLayoutRTL() 方法,如下所示:
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;
    }
}

5
谢谢Mohammad!他优美地解决了问题。 - Ashkan Sarlak
谢谢!实际上,isLayoutRTL()GridLayoutManager 的一个已记录保护方法,因此这个解决方案是向前兼容的。 - Alex Cohn
谢谢Mohammad,太棒了。 - Armin Ghoreishi
1
考虑使用RecyclerView 24.2.0及以上版本以获得更好的结果。根据GridLayoutManager文档,RTL处理比以前更好。我之前在调用notifyDataSetChanged()时遇到了一些问题。 - Navid Eivazzadeh
它使用起来安全吗?不需要API 17+吗? - Alireza Noorali
谢谢,它起作用了。 如果我们需要编写类,android:layoutDirection="rtl" 的作用是什么? - The MJ

14

Mohammad的答案是正确的,但您不需要创建一个新类。您只需覆盖isLayoutRTL方法即可。

GridLayoutManager lm = new GridLayoutManager(this, 2) {
    @Override
    protected boolean isLayoutRTL() {
        return true;
    }
};

5

有更好的方法来做这件事

您可以以编程方式更改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);

它可以正常工作,你只需要调用 ViewCompat.setLayoutDirection(workHourRecycler, View.LAYOUT_DIRECTION_RTL) - Tijee
ViewCompat.setLayoutDirection(View, int) 在 API < 17 上无效。使用 ViewCompat 只是为了让它在不支持该方法的 API 级别上不会抛出异常。 - Subaru Tashiro

1
表面上看,当getLayoutDirection()返回ViewCompat.LAYOUT_DIRECTION_RTL时,GridLayouManager应该从右侧填充行。通常,此方向将继承自RecyclerView的容器。
但如果这不像预期的那样工作,或者您需要将其推到API 16,或者您使用的设备对RTL支持的实现不好,您可以简单地从github获取GridLayoutManager并使用您自己调整的自定义管理器。
扩展库存GridLayoutManager并覆盖layoutChunk()可能已经足够了。

我无法覆盖它,因为它是包可见的。而且我找不到这个方法在哪里被使用。但它看起来很有前途。 - Ashkan Sarlak
1
什么可能会阻止你使用语句“package android.support.v7.widget;”启动自定义管理器? - Alex Cohn
1
谢谢Alex。我不知道那个。实际上,绕过这个问题很容易。感谢你提供的指示。 - Ashkan Sarlak

-6

非常简单,只需调用方法setReverseLayout,如下:

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

3
这只会让它颠倒过来! - Ammar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接