Gibt es eine Möglichkeit, Bildlaufleisten für RecyclerView im Code zu aktivieren?

105

Wie wir gesehen haben, ist RecyclerView effektiver als ListView, daher bevorzuge ich es, es in meinem Projekt zu verwenden. Aber vor kurzem habe ich Probleme, wenn ich es in meine benutzerdefinierte ViewGroup lege. RecyclerView ist einfach, Bildlaufleisten in XML wie folgt festzulegen:

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

Aber ich kann wirklich keine Methode finden, um die Bildlaufleisten im Code für RecyclerView festzulegen. Ich habe Folgendes versucht:

mRecyclerView.setVerticalScrollBarEnabled(true);

und dann habe ich das in Android's Dokument gesehen.

Also habe ich versucht, meinen eigenen LayoutManager zu erstellen und die Funktionen zu überschreiben, die ich für nötig hielt. Aber schließlich habe ich versagt. Kann mir jemand sagen, wie ich meinen eigenen LayoutManager erstellen oder mir einfach eine andere Lösung zeigen soll? Danke dir!

Kevin Liu
quelle

Antworten:

125

Im Moment scheint es unmöglich zu sein, Bildlaufleisten programmgesteuert zu aktivieren. Der Grund für dieses Verhalten ist, dass Android weder View.initializeScrollbarsInternal(TypedArray a)oder anruft View.initializeScrollbars(TypedArray a). Beide Methoden werden nur aufgerufen, wenn Sie Ihre RecyclerView mit einem AttributeSet instanziieren.
Als Problemumgehung würde ich vorschlagen, dass Sie eine neue Layoutdatei nur mit Ihrem RecyclerView erstellen: 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" />

Jetzt können Sie die RecyclerView mit Bildlaufleisten überall dort aufblasen und hinzufügen, wo Sie möchten: 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
quelle
3
Ich benutze diesen Weg jetzt, aber wirklich danke, dass du mir den Grund gesagt hast!
Kevin Liu
1
Jetzt können Sie ganz einfach Bildlaufleisten hinzufügen! Überprüfen Sie diese Antwort: stackoverflow.com/a/39125108/3162918
Bendaf
72

Stellen Sie die vertikale Bildlaufleiste im XML-Layout ein

<android.support.v7.widget.RecyclerView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:scrollbars="vertical" />
Lilo
quelle
2
Ist das genug oder müssen wir auch einstellen android:scrollbarStyle="outsideOverlay"?
IgorGanapolsky
1
@IgorGanapolsky Keine Notwendigkeit, es einzustellen, es sei denn, Sie möchten angeben, ob Ihre Bildlaufleiste überlagert oder eingefügt werden würde
Lilo
2
Dies beantwortet die Frage nicht wirklich, da OP überhaupt kein XML-Layout verwendete und dies daher programmgesteuert haben wollte.
Andrew T.
Und Sie haben optionale Attribute wieandroid:fadeScrollbars="true"
Junior Mayhé
36

Nur in XML-Eigenschaften

<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
quelle
Wie kann man die Farbe per Bildlauf einstellen? wie recyclerview.scrollview.color = R.color.some_one
marlonpya
13

Ich würde es vorziehen, dafür zu verwenden ContextThemeWrapper.

Definieren Sie zuerst in Style.xml:

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

Und wann immer Sie Ihre RecyclerView initialisieren, verwenden Sie ContextThemeWrapper:

RecyclerView recyclerView = new RecyclerView(new ContextThemeWrapper(context, R.style.ScrollbarRecyclerView));
Ayaz Alifov
quelle
7

Sie können dies tun, ohne ein XML-Layout aufzublasen, müssen jedoch ein benutzerdefiniertes Designattribut und einen Stil deklarieren:

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

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

Stellen Sie dann den Wert des Attributs auf den Stil in Ihrem Thema ein:

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

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

Jetzt können Sie die RecyclerView programmgesteuert mit einer vertikalen Bildlaufleiste erstellen:

RecyclerView recyclerView = new RecyclerView(context, null, R.attr.verticalRecyclerViewStyle);
BladeCoder
quelle
1

Verwenden Sie einen Code wie:

<androidx.recyclerview.widget.RecyclerView
 android:id="@+id/categoryRecyclerLayout"
 android:layout_width="414dp"
 android:layout_height="652dp"
 android:scrollbars="vertical" .... />
Achintha Isuru
quelle