¿Hay alguna forma de habilitar las barras de desplazamiento para RecyclerView en el código?

105

Como vimos, RecyclerView es más efectivo que ListView, así que prefiero usarlo en mi proyecto. Pero recientemente tuve un problema al ponerlo en mi ViewGroup personalizado. RecyclerView es fácil de configurar barras de desplazamiento en xml como este:

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

Pero realmente no puedo encontrar ningún método para configurar las barras de desplazamiento en el código para RecyclerView, lo que he probado es:

mRecyclerView.setVerticalScrollBarEnabled(true);

y luego vi esto en el documento de Android.

Así que intenté crear mi propio LayoutManager y anular las funciones que pensé que necesitaba. Pero finalmente fallé. Entonces, ¿alguien puede decirme cómo debo hacer mi propio LayoutManager o simplemente mostrarme otra solución? ¡Gracias!

Kevin Liu
fuente

Respuestas:

125

Por el momento, parece imposible habilitar las barras de desplazamiento mediante programación. La razón de ese comportamiento es que Android no llama ni a View.initializeScrollbarsInternal(TypedArray a)ni View.initializeScrollbars(TypedArray a). Ambos métodos solo se llaman si crea una instancia de su RecyclerView con un AttributeSet.
Como solución, sugeriría que cree un nuevo archivo de diseño solo con su 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" />

Ahora puede inflar y agregar RecyclerView con barras de desplazamiento donde quiera: 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);
    }
}
usuario1185087
fuente
3
Lo estoy usando de esta manera ahora, ¡pero realmente gracias por decirme el motivo!
Kevin Liu
1
¡Ahora puede agregar barras de desplazamiento fácilmente! Compruebe esta respuesta: stackoverflow.com/a/39125108/3162918
bendaf
72

Establecer la barra de desplazamiento vertical en el diseño xml

<android.support.v7.widget.RecyclerView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:scrollbars="vertical" />
Lilo
fuente
2
¿Es esto suficiente o también tenemos que configurar android:scrollbarStyle="outsideOverlay"?
IgorGanapolsky
1
@IgorGanapolsky No es necesario configurarlo, a menos que desee especificar si su barra de desplazamiento estaría superpuesta o insertada
Lilo
2
Esto realmente no responde a la pregunta, ya que OP no usó diseño XML en absoluto y, por lo tanto, quería tener esto programáticamente.
Andrew T.
Y tienes atributos opcionales comoandroid:fadeScrollbars="true"
Junior Mayhé
38

Solo en propiedades 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 soleado
fuente
¿Cómo se puede establecer el color mediante scroll? como recyclerview.scrollview.color = R.color.some_one
marlonpya
14

Preferiría usar ContextThemeWrapperpara eso.

Primero defina en Style.xml:

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

Y luego, cada vez que inicialice su RecyclerView, use ContextThemeWrapper:

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

Puede hacerlo sin inflar un diseño XML, pero deberá declarar un atributo de tema personalizado y un estilo:

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

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

Luego, establezca el valor del atributo en el estilo de su tema:

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

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

Ahora puede crear el RecyclerView mediante programación con una barra de desplazamiento vertical:

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

Usa un código como:

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