Есть ли способ включить полосы прокрутки для RecyclerView в коде?

105

Как мы видели, RecyclerView более эффективен, чем ListView, поэтому я предпочитаю использовать его в своем проекте. Но недавно у меня возникла проблема, когда я поместил его в свою пользовательскую ViewGroup. RecyclerView легко установить полосы прокрутки в xml следующим образом:

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:scrollbars="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Но я действительно не могу найти никакого метода для установки полос прокрутки в коде для RecyclerView, что я пробовал:

mRecyclerView.setVerticalScrollBarEnabled(true);

а потом я увидел это в документе Android.

Поэтому я попытался создать свой собственный LayoutManager и переопределить функции, которые, как мне казалось, мне нужны. Но в конце концов я потерпел неудачу. Так может ли кто-нибудь сказать мне, как мне создать свой собственный LayoutManager, или просто показать мне другое решение. Спасибо!

Кевин Лю
источник

Ответы:

126

На данный момент программно включить полосы прокрутки невозможно. Причина такого поведения в том, что Android не вызывает ни View.initializeScrollbarsInternal(TypedArray a)или View.initializeScrollbars(TypedArray a). Оба метода вызываются только в том случае, если вы создаете экземпляр RecyclerView с помощью AttributeSet.
В качестве обходного пути я бы посоветовал вам создать новый файл макета только с помощью RecyclerView: vertical_recycler_view.xml

<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" />

Теперь вы можете раздуть и добавить RecyclerView с полосами прокрутки везде, где захотите: MyCustomViewGroup.java

public class MyCustomViewGroup extends FrameLayout
{
    public MyCustomViewGroup(Context context)
    {
        super(context);

        RecyclerView verticalRecyclerView = (RecyclerView) LayoutInflater.from(context).inflate(R.layout.vertical_recycler_view, null);
        verticalRecyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
        addView(verticalRecyclerView);
    }
}
user1185087
источник
3
Я использую этот способ сейчас, но действительно спасибо, что объяснил причину!
Кевин Лю
1
Теперь вы можете легко добавлять полосы прокрутки! Отметьте этот ответ: stackoverflow.com/a/39125108/3162918
bendaf
72

Установите вертикальную полосу прокрутки в макете xml

<android.support.v7.widget.RecyclerView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:scrollbars="vertical" />
Лило
источник
2
Этого достаточно, или еще надо установить android:scrollbarStyle="outsideOverlay"?
Игорь Ганапольский
1
@IgorGanapolsky Нет необходимости устанавливать его, если только вы не хотите указать, будет ли ваша полоса прокрутки накладываться или вставляться
Лило
2
На самом деле это не отвечает на вопрос, поскольку OP вообще не использовал XML-макет и поэтому хотел иметь это программно.
Эндрю Т.
И у вас есть дополнительные атрибуты, такие какandroid:fadeScrollbars="true"
Джуниор Мэйхе
38

Просто в свойствах xml

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/recyclerView"
    android:scrollbars="vertical" <!-- type of scrollbar -->
    android:scrollbarThumbVertical="@android:color/darker_gray"  <!--color of scroll bar-->
    android:scrollbarSize="5dp"> <!--width of scroll bar-->

</android.support.v7.widget.RecyclerView>
Динеш Санни
источник
как установить цвет с помощью прокрутки? как recyclerview.scrollview.color = R.color.some_one
marlonpya
14

Я бы предпочел использовать ContextThemeWrapperдля этого.

Сначала определите в Style.xml:

<style name="ScrollbarRecyclerView" parent="android:Widget">
    <item name="android:scrollbars">vertical</item>
</style>

И затем всякий раз, когда вы инициализируете свой RecyclerView, используйте ContextThemeWrapper:

RecyclerView recyclerView = new RecyclerView(new ContextThemeWrapper(context, R.style.ScrollbarRecyclerView));
Аяз Алифов
источник
7

Вы можете сделать это, не раздувая XML-макет, но вам нужно будет объявить настраиваемый атрибут темы и стиль:

<resources>
    <attr name="verticalRecyclerViewStyle" format="reference"/>

    <style name="VerticalRecyclerView" parent="android:Widget">
        <item name="android:scrollbars">vertical</item>
    </style>
</resources>

Затем установите значение атрибута для стиля в вашей теме:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

    <item name="verticalRecyclerViewStyle">@style/VerticalRecyclerView</item>
</style>

Теперь вы можете программно создать RecyclerView с вертикальной полосой прокрутки:

RecyclerView recyclerView = new RecyclerView(context, null, R.attr.verticalRecyclerViewStyle);
BladeCoder
источник
1

Используйте такой код:

<androidx.recyclerview.widget.RecyclerView
 android:id="@+id/categoryRecyclerLayout"
 android:layout_width="414dp"
 android:layout_height="652dp"
 android:scrollbars="vertical" .... />
Ачинта Исуру
источник