在主题级别的RecyclerView样式

时间:2016-08-22 10:05:39

标签: android listview styles android-recyclerview themes

我尝试在主题级别为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 或其他什么?

如果没有,那我怎样才能在主题层面实现这个目标?

4 个答案:

答案 0 :(得分:9)

不幸的是,listViewStyle并不等同于RecylerView

我认为您可以做的最好的事情是为RecyclerView定义一种风格,然后根据您使用style="@style/RecyclerViewStyle"的风格设置您想要使用的任何视图(如果您只想定义一个像你的例子中的情侣属性。)

如果您真的不想为每个RecyclerView执行此操作,那么您必须对其进行子类化并为defStyle返回非零参数构造函数。但是,您必须用新的子类替换XML中RecyclerView的所有实例。

答案 1 :(得分:3)

  

主题级别的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'
}

您可以看到提交here

示例:

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小部件定义了应用程序范围的默认样式。

答案 2 :(得分:1)

正如@Jason Robinson所说,您可以通过这种方式继承RecyclerView,将RecyclerView替换为xml中的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);
    }
}

答案 3 :(得分:0)

根据this changelog,2019年8月7日,RecyclerView添加了一个recyclerViewStyle样式属性,其行为与listViewStyle类似。

将其添加到您的build.gradle

dependencies {
    ...
    implementation 'androidx.recyclerview:recyclerview:1.1.0-beta02'
    ...
}

注意:您需要使用AndroidX,它是Android Jetpack.

的一部分