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!

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);
    }
}

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" />

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>

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));

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);

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" .... />
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.