Czy istnieje sposób, aby włączyć paski przewijania dla RecyclerView w kodzie?

105

Jak widzieliśmy, RecyclerView jest bardziej efektywny niż ListView, więc wolę używać go w moim projekcie. Ale ostatnio mam problem z umieszczeniem go w mojej niestandardowej grupie ViewGroup. RecyclerView jest łatwy do ustawienia pasków przewijania w XML w następujący sposób:

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

Ale naprawdę nie mogę znaleźć żadnej metody ustawiania pasków przewijania w kodzie dla RecyclerView, próbowałem:

mRecyclerView.setVerticalScrollBarEnabled(true);

a potem zobaczyłem to w dokumencie Androida.

Próbowałem więc stworzyć własnego LayoutManagera i zastąpić funkcje, które uważałem za potrzebne. Ale w końcu zawiodłem. Czy ktoś może mi powiedzieć, jak mam stworzyć własny LayoutManager lub po prostu pokazać inne rozwiązanie. Dziękuję Ci!

Kevin Liu
źródło

Odpowiedzi:

126

W tej chwili wydaje się niemożliwe programowe włączenie pasków przewijania. Przyczyną tego zachowania jest to, że Android nie zadzwonić albo View.initializeScrollbarsInternal(TypedArray a)albo View.initializeScrollbars(TypedArray a). Obie metody są wywoływane tylko wtedy, gdy utworzysz wystąpienie RecyclerView z zestawem AttributeSet.
Aby obejść ten problem, sugerowałbym utworzenie nowego pliku układu tylko za pomocą 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" />

Teraz możesz nadmuchać i dodać RecyclerView z paskami przewijania w dowolnym miejscu: 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
źródło
3
Teraz używam tego sposobu, ale naprawdę dziękuję za podanie powodu!
Kevin Liu
1
Teraz możesz łatwo dodawać paski przewijania! Sprawdź odpowiedź: stackoverflow.com/a/39125108/3162918
bendaf
72

Ustaw pionowy pasek przewijania w układzie XML

<android.support.v7.widget.RecyclerView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:scrollbars="vertical" />
Lilo
źródło
2
Czy to wystarczy, czy też musimy ustawić android:scrollbarStyle="outsideOverlay"?
IgorGanapolsky
1
@IgorGanapolsky Nie trzeba go ustawiać, chyba że chcesz określić, czy pasek przewijania ma być nałożony, czy wstawiony
Lilo
2
To tak naprawdę nie odpowiada na pytanie, ponieważ OP w ogóle nie używał układu XML, a zatem chciał mieć to programowo.
Andrew T.
Masz opcjonalne atrybuty, takie jakandroid:fadeScrollbars="true"
Junior Mayhé
38

Tylko we właściwościach 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>
Dinesh Sunny
źródło
jak ustawić kolor za pomocą przewijania? jak recyclinglerview.scrollview.color = R.color.some_one
marlonpya
14

Wolałbym do tego użyć ContextThemeWrapper.

Najpierw zdefiniuj w Style.xml:

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

A potem za każdym razem, gdy zainicjujesz swój RecyclerView, użyj ContextThemeWrapper:

RecyclerView recyclerView = new RecyclerView(new ContextThemeWrapper(context, R.style.ScrollbarRecyclerView));
Ayaz Alifov
źródło
7

Możesz to zrobić bez zawyżania układu XML, ale musisz zadeklarować niestandardowy atrybut motywu i styl:

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

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

Następnie ustaw wartość atrybutu na styl w swoim motywie:

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

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

Teraz możesz programowo utworzyć RecyclerView za pomocą pionowego paska przewijania:

RecyclerView recyclerView = new RecyclerView(context, null, R.attr.verticalRecyclerViewStyle);
BladeCoder
źródło
1

Użyj kodu takiego jak:

<androidx.recyclerview.widget.RecyclerView
 android:id="@+id/categoryRecyclerLayout"
 android:layout_width="414dp"
 android:layout_height="652dp"
 android:scrollbars="vertical" .... />
Achintha Isuru
źródło