如何从右到左用 GridLayoutManager 填充 RecyclerView
How can I fill RecyclerView with GridLayoutManager from right to left
我正在尝试将一些数据填充到 RecyclerView
中 GridLayoutManager
:
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;
}
};
我正在尝试将一些数据填充到 RecyclerView
中 GridLayoutManager
:
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;
}
};