注意! この記事はQiitaにて公開されていた内容をimportしたものです。
これらの内容は場合によっては陳腐化していて役に立たなくなっていたり、有害であったり、現在の著者の主張と異なることがあります。
皆様の判断の上でご利用いただけますと幸いです(度を超してヤバいものは著者に連絡して頂ければ対応します m(_ _)m)


Databindingが登場し久しいこの頃ですが、いかがお過ごしでしょうか。

ところで、Databindingを使うとViewのgetter/setterをXML attributeで設定できるようになります。 例えば、TextView#setTypeFace()app:typeFace="@{model.typeface}"のようにして指定できます。

そのようなノリでRecyclerView#setLayoutManagerを使おうとするとちょっとハマります。

実はRecylerViewの app:layoutManager はDatabindingではなくRecyclerView標準搭載のattributeです。 https://android.googlesource.com/platform/frameworks/support/+/oreo-cts-release/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java#603

もう少し読んでいくと、以下のメソッドでクラスの生成を行っています。 https://android.googlesource.com/platform/frameworks/support/+/oreo-cts-release/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java#676

このとき、(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)な4引数コンストラクタを使ってクラス生成を試み、だめなら無引数コンストラクタをつかうような振る舞いをします。

例としてLinearLayoutManagerを見てみると、こんな感じです。 https://android.googlesource.com/platform/frameworks/support/+/oreo-cts-release/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java#172

実はJavadocに使用方法が書かれています。android:orientationでdirection指定もできます。こんな感じ。

<android.support.v7.widget.RecyclerView
    android:id="@+id/sceneRecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    
    android:orientation="horizontal"
    app:reverseLayout="true"
    app:stackFromEnd="false"
    app:layoutManager="android.support.v7.widget.LinearLayoutManager" />

ロジック側でlayoutManagerの設定を書かずに済むので、若干コードがスッキリするかも知れません。