根据Google的RecyclerView documentation,您可以在布局文件中通过在LayoutManager的'layoutManager'属性中指定其类名来设置特定的RecyclerView。它还特别提到LayoutManager具有接受AttributeSet的构造函数。

我的问题是,因为您是通过LayoutManager元素上的属性而不是作为其自己的元素来指定RecyclerView的,所以在哪里/如何设置针对LayoutManager本身的属性?

我的猜测是您也将它们直接添加到RecyclerView元素中。这就像在RecyclerView的构造函数内部一样,当实例化在'layoutManager'属性中指定的LayoutManager时,它可以简单地传递给传递给它的同一AttributeSet。但是,这只是一个猜测。

这是我正在考虑的正确方法的示例:

<MyRecyclerView
    app:layoutManager=".MyLayoutManager"
    app:attrOnlyUsedByRecyclerView="I'm used by MyRecyclerView"
    app:attrOnlyUsedByLayoutManager="I'm used by MyLayoutManager" />


注意如何从技术上在MyRecyclerView元素上设置所有三个属性,但是我们想到的是第三个属性被MyRecyclerView的构造函数忽略,并从MyLayoutManager的构造函数传递到的构造函数。

我正在尝试构建一个演示应用程序来测试该理论,但是与此同时,任何人都可以肯定地阐明这一点,或者如果这是不正确的话,至少可以将我指向正确的方向?

最佳答案

经过一些测试,您似乎可以直接将相关属性直接应用于RecyclerView元素,这些属性将直接传递给LayoutManager

例如,LinearLayoutManager的相关构造函数为:

/**
 * Constructor used when layout manager is set in XML by RecyclerView attribute
 * "layoutManager". Defaults to vertical orientation.
 *
 * @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_android_orientation
 * @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_reverseLayout
 * @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_stackFromEnd
 */
public LinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr,
                           int defStyleRes) {
    Properties properties = getProperties(context, attrs, defStyleAttr, defStyleRes);
    setOrientation(properties.orientation);
    setReverseLayout(properties.reverseLayout);
    setStackFromEnd(properties.stackFromEnd);
    setAutoMeasureEnabled(true);
}


...这是您为LayoutManager指定'stackFromEnd'属性的方法。 (请注意,即使它是为RecyclerView指定的,也应如何在LayoutManager元素上进行设置。)

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

10-08 17:57