Чи є спосіб включити смуги прокрутки для 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 або просто показати мені інше рішення. Дякую!

Відповіді:


125

На даний момент, здається, неможливо програмно включити смуги прокрутки. Причиною такої поведінки є те , що 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);
    }
}

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 Не потрібно встановлювати його, якщо ви не хочете вказати, чи буде ваша смуга прокрутки накладена або вставлена
Lilo

2
Це насправді не відповідає на питання, оскільки ОП взагалі не використовував макет XML і, таким чином, хотів мати це програмно.
Андрій Т.

І у вас є необов'язкові атрибути, такі якandroid:fadeScrollbars="true"
Junior Mayhé

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>

як можна встановити колір за допомогою прокрутки? як recilerview.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);

1

Використовуйте такий код, як:

<androidx.recyclerview.widget.RecyclerView
 android:id="@+id/categoryRecyclerLayout"
 android:layout_width="414dp"
 android:layout_height="652dp"
 android:scrollbars="vertical" .... />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.