31

我正在尝试将一些数据填充到RecyclerViewwith 中GridLayoutManager

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

这会将数据从左到右填充到网格中。第一项将被放在左上角,依此类推。

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

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

设置layoutDirection属性RecyclerView也不起作用(不考虑我的最小 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

4

5 回答 5

77

创建一个扩展的类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;
    }
}
于 2015-10-05T11:13:22.823 回答
11

Mohammad 的回答是正确的,但您不需要创建一个新类。您可以简单地覆盖 isLayoutRTL 方法。

GridLayoutManager lm = new GridLayoutManager(this, 2) {
    @Override
    protected boolean isLayoutRTL() {
        return true;
    }
};
于 2018-09-14T16:28:34.943 回答
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);
于 2018-04-19T13:19:30.673 回答
1

从表面上看,GridLayouManager 应该在给时从右边填充行。通常,此方向将从容器继承。getLayoutDirection()ViewCompat.LAYOUT_DIRECTION_RTLRecyclerView's

但是,如果这不能按预期工作,或者您需要将其推送到 API 16,或者您的某些设备的 RTL 支持实现不佳,您可以简单地GridLayoutManager从 github 拉取,并使用您喜欢的自定义管理器.

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

于 2015-10-04T15:40:30.273 回答
-6

它非常简单,只需调用方法setReverseLayout

GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
layoutManager.setReverseLayout(true);
于 2015-11-23T09:46:43.333 回答