在主题级别的RecyclerView样式



我试图在主题级别实现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的一部分。

相关内容

  • 没有找到相关文章

最新更新