如何从右到左填充RecyclerView和GridLayoutManager

时间:2015-10-03 09:15:05

标签: android android-recyclerview right-to-left gridlayoutmanager

我尝试使用RecyclerView将一些数据填充到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创建一个从左到右填充的网格?

5 个答案:

答案 0 :(得分:59)

创建一个扩展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;
    }
}

答案 1 :(得分:3)

有一种更好的方法可以做到这一点

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

答案 2 :(得分:2)

穆罕默德(Mohammad)的回答是正确的,但您无需创建新的班级。您可以简单地覆盖isLayoutRTL方法。

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

答案 3 :(得分:1)

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

但是如果这不能按预期工作,或者您需要将其推送到API 16,或者您的某些设备执行RTL支持不良,您只需从github中提取GridLayoutManager,然后使用根据自己的喜好调整的自定义经理。

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

答案 4 :(得分:-5)

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

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