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


Como vimos, RecyclerView es más efectivo que ListView, por lo que prefiero usarlo en mi proyecto. Pero recientemente tuve un problema cuando lo puse en mi ViewGroup personalizado. RecyclerView es fácil de configurar las barras de desplazamiento en xml de esta manera:

<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 de RecyclerView, lo que he intentado es:

mRecyclerView.setVerticalScrollBarEnabled(true);

y luego vi esta en el documento de Android.

Así que traté de crear mi propio LayoutManager y anular las funciones que creía necesitar. Pero finalmente fallé. Entonces, ¿alguien puede decirme cómo debería crear mi propio LayoutManager o simplemente mostrarme otra solución? ¡Gracias!


76
2017-11-21 07:39


origen


Respuestas:


Por el momento, parece ser imposible habilitar las barras de desplazamiento programáticamente. La razón de ese comportamiento es que Android tampoco llama View.initializeScrollbarsInternal(TypedArray a) o View.initializeScrollbars(TypedArray a). Ambos métodos solo se invocan si crea una instancia de su RecyclerView con un AttributeSet.
Como solución alternativa, le sugiero que cree un nuevo archivo de diseño con su RecyclerView solamente: 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);
    }
}

94
2017-12-04 16:20



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

53
2017-09-11 09:03



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>

22
2017-08-24 13:46



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>

A continuación, 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);

6
2017-11-27 20:40



Yo preferiría usar ContextThemeWrapper para 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 uso de RecyclerView ContextThemeWrapper:

RecyclerView recyclerView = new RecyclerView(new ContextThemeWrapper(context, R.style.ScrollbarRecyclerView));

5
2018-01-30 13:48