主题级别的RecyclerView样式设置

16

我正在尝试为主题级别实现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 或其他内容?

如果没有,那么如何在主题级别上实现此目标?


也许https://dev59.com/vmMl5IYBdhLWcg3wTljY#24580870可以帮助。 - avinash
4个回答

12

RecyclerView 主题级别的样式设置

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

若要使用上述功能,请在您的build.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小部件定义了应用程序范围的默认样式。


10

很遗憾,RecylerView 没有与 listViewStyle 等价的属性。

我认为最好的方法是为您的 RecyclerView 定义一个样式,然后让您想使用该样式的任何视图都使用 style="@style/RecyclerViewStyle"(如果您只想定义一些属性,就像在您的示例中一样)。

如果您真的不想对每个 RecyclerView 进行此操作,那么您就需要对其进行子类化,并在构造函数中返回一个非零参数作为 defStyle。然而,您将不得不将所有 XML 中的 RecyclerView 实例替换为您新子类的类。


1
根据2019年8月7日的更新日志RecyclerView添加了recyclerViewStyle样式属性,其行为类似于listViewStyle
将其添加到您的build.gradle中:
dependencies {
    ...
    implementation 'androidx.recyclerview:recyclerview:1.1.0-beta02'
    ...
}

注意:您需要使用AndroidX,它是Android Jetpack的一部分。

1
如@Jason Robinson所说,您可以通过这种方式对RecyclerView进行子类化,在xml中将RecyclerView替换为RecyclerViewStyleable,然后使用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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接