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