如何从右到左用 GridLayoutManager 填充 RecyclerView

How can I fill RecyclerView with GridLayoutManager from right to left

我正在尝试将一些数据填充到 RecyclerViewGridLayoutManager:

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

这会将数据从左到右填充到网格中。第一项将放在左上角等位置

但是我正在开发的应用程序是为 RTL 语言设计的,所以我需要让它从从右到左填充。

我试图将最后一个参数更改为 true。但它只是将 RecyclerView 一直向下滚动。

同时为 RecyclerView 设置 layoutDirection 属性也不起作用(没有考虑我的最小 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 创建从右到左填充的网格?

从表面上看,当 getLayoutDirection() 给出 ViewCompat.LAYOUT_DIRECTION_RTL 时,GridLayouManager 应该 fill rows from right。通常,此方向将继承自 RecyclerView's 容器。

但是如果这没有按预期工作,或者您需要将其下推到 API16,或者您的某些设备的 RTL 支持实现不佳,您可以简单地拉 GridLayoutManager来自 github,并使用您根据自己的喜好调整的自定义管理器。

扩展库存 GridLayoutManager 并覆盖 layoutChunk() 可能就足够了。

创建一个扩展 GridLayoutMAnager 的 class ,并像这样覆盖 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;
    }
}

很简单,调用方法setReverseLayout就可以了,

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

有更好的方法

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

Mohammad 的回答是正确的,但您不需要创建新的 class。您可以简单地重写 isLayoutRTL 方法。

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