Стиль 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 или что-нибудь еще?

Если нет, то как я могу достичь этого на уровне темы?

Ответ 1

Не существует эквивалента listViewStyle для RecylerView, к сожалению.

Я думаю, что лучшее, что вы можете сделать, это определить стиль для вашего RecyclerView, а затем использовать любые представления, которые вы хотите использовать в этом стиле, style="@style/RecyclerViewStyle" (если вы просто хотите определить пару атрибутов, как в вашем примере).

Если вы действительно просто не хотите делать это для каждого RecyclerView, тогда вам придется подклассифицировать его и вернуть ненулевой параметр для defStyle в конструкторе. Однако вам придется заменить все экземпляры вашего RecyclerView в XML на ваш новый класс подкласса.

Ответ 2

  Стиль 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.

Ответ 3

Как @Jason Robinson говорит, что вы можете подклассифицировать RecyclerView таким образом, замените RecyclerView на RecyclerViewStyleable в xml, а затем создайте его с помощью 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);
    }
}

Ответ 4

Согласно этому журналу изменений 7 августа 2019 года, RecyclerView добавляет атрибут стиля recyclerViewStyle, который ведет себя подобно listViewStyle.

Добавьте его в свой build.gradle:

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

Примечание. Вам необходимо использовать AndroidX, который входит в состав Android Jetpack.