web-dev-qa-db-ja.com

右から左にGridLayoutManagerでRecyclerViewを埋める方法

一部のデータをRecyclerViewGridLayoutManagerで埋めようとしています:

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

これにより、グリッドに左から右のデータが入力されます。最初のアイテムは左上に配置されます。

しかし、私が開発しているアプリはRTL言語用に設計されているので、それを右から左で埋める必要があります。

最後の引数をtrueに変更しようとしました。しかし、RecyclerViewを下にスクロールしただけです。

また、layoutDirectionRecyclerView属性を設定しても機能しません(私の最小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を使用して右から左の塗りつぶしグリッドを作成するにはどうすればよいですか?

29
Ashkan Sarlak

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;
    }
}
62

Mohammadの答えは正しいですが、新しいクラスを作成する必要はありません。 isLayoutRTLメソッドを単純にオーバーライドできます。

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

それを行うためのより良い方法があります

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);
3

一見すると、GridLayouManagerは、getLayoutDirection()ViewCompat.LAYOUT_DIRECTION_RTLを与えると、 行を右から埋める 必要があります。通常、この方向はRecyclerView'sコンテナから継承されます。

しかし、これが期待どおりに機能しない場合、またはAPI 16にプッシュダウンする必要がある場合、またはRTLサポートの実装が不適切なデバイスの場合は、githubからGridLayoutManagerをプルして、カスタムマネージャーを使用できます。好みに合わせて調整してください。

ストックGridLayoutManagerを拡張し、 layoutChunk() をオーバーライドするだけで十分な場合があります。

1
Alex Cohn