根据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" />