我试图在主题级别实现RecyclerView
的通用样式参数。与ListView
相比,我使用了这样的内容:
定义了一个样式:
<style name="StyleListView" parent="Widget.AppCompat.ListView">
<item name="android:requiresFadingEdge">vertical</item>
<item name="android:fadingEdgeLength">10dp</item>
<item name="android:scrollbars">vertical</item>
</style>
和后来使用在我的自定义主题:
<item name="android:listViewStyle">@style/StyleListView</item>
这完全适用于ListView
。然而,我无法为RecyclerView
反映这一点,因为我认为它适用于任何类型的列表。
那么,是否有任何预定义的样式属性可用于RecyclerView
,例如 android:recyclerViewStyle
或任何东西?
如果没有,那么我如何在主题级别实现这一点?
主题级的recycleview样式
RecyclerView现在有一个默认的样式属性:recyclerViewStyle
,它允许在你的主题中设置默认样式
支持以下属性
<!-- Class name of the Layout Manager to be used. -->
<attr name="layoutManager" format="string" />
<!-- ============================= -->
<!-- Attributes for Layout Manager -->
<!-- ============================= -->
<attr name="android:orientation" />
<attr name="android:descendantFocusability" />
<attr name="android:clipToPadding" />
<attr name="spanCount" format="integer"/>
<attr name="reverseLayout" format="boolean" />
<attr name="stackFromEnd" format="boolean" />
<attr name="fastScrollEnabled" format="boolean" />
<attr name="fastScrollVerticalThumbDrawable" format="reference" />
<attr name="fastScrollVerticalTrackDrawable" format="reference" />
<attr name="fastScrollHorizontalThumbDrawable" format="reference" />
<attr name="fastScrollHorizontalTrackDrawable" format="reference" />
要使用上述特性,请在构建中添加/更新以下依赖项。gradle文件。
dependencies {
implementation 'androidx.recyclerview:recyclerview:1.1.0-beta05'
}
您可以在这里看到提交。
例子:
1。定义默认样式
<style name="DefaultRecyclerViewStyle">
<item name="layoutManager">androidx.recyclerview.widget.GridLayoutManager</item>
<item name="android:orientation">vertical</item>
<item name="spanCount">2</item>
</style>
2。将上述样式添加到您的默认主题
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="recyclerViewStyle">@style/DefaultRecyclerViewStyle</item>
</style>
这,所有。您已经为您的RecyclerView小部件定义了一个应用程序范围的默认样式。
遗憾的是,RecylerView
没有对应的listViewStyle
。
我认为你能做的最好的是为你的RecyclerView
定义一个风格,然后有任何视图,你想使用该风格使用style="@style/RecyclerViewStyle"
(如果你只是想在你的例子中定义一对属性)。
如果你真的不想为每个RecyclerView
都这样做,那么你必须子类化它,并在构造函数中为defStyle
返回一个非零参数。但是,您必须用新子类化的类替换XML中的RecyclerView
的所有实例。
正如@Jason Robinson所说,你可以用这种方式子类化RecyclerView,用xml中的RecyclerViewStyleable
替换RecyclerView
,然后用recyclerViewStyle
来样式化它
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="RecyclerViewStyleable">
<attr name="recyclerViewStyle"/>
</declare-styleable>
</resources>
public class RecyclerViewStyleable extends RecyclerView {
public RecyclerViewStyleable(Context context) {
super(context);
}
public RecyclerViewStyleable(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.recyclerViewStyle);
}
public RecyclerViewStyleable(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
}
根据2019年8月7日的变更日志,RecyclerView
增加了一个recyclerViewStyle
样式属性,其行为类似于listViewStyle
。
添加到你的build.gradle
:
dependencies {
...
implementation 'androidx.recyclerview:recyclerview:1.1.0-beta02'
...
}
注意:你需要使用AndroidX,这是Android Jetpack的一部分。