我尝试使用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
创建一个从左到右填充的网格?
答案 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);