C'è un modo per abilitare le barre di scorrimento per RecyclerView nel codice?


105

Come abbiamo visto, RecyclerView è più efficace di ListView, quindi preferisco usarlo nel mio progetto. Ma di recente ho problemi quando lo metto nel mio ViewGroup personalizzato. RecyclerView è facile da impostare le barre di scorrimento in xml in questo modo:

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

Ma davvero non riesco a trovare alcun metodo per impostare le barre di scorrimento nel codice per RecyclerView, quello che ho provato è:

mRecyclerView.setVerticalScrollBarEnabled(true);

e poi ho visto questo nel documento di Android.

Quindi ho provato a creare il mio LayoutManager e sovrascrivere le funzioni che pensavo di aver bisogno. Ma alla fine ho fallito. Quindi qualcuno può dirmi come devo creare il mio LayoutManager o semplicemente mostrarmi un'altra soluzione. Grazie!

Risposte:


125

Al momento sembra impossibile abilitare le barre di scorrimento a livello di programmazione. La ragione di questo comportamento è che Android non chiama né View.initializeScrollbarsInternal(TypedArray a)o View.initializeScrollbars(TypedArray a). Entrambi i metodi vengono chiamati solo se si crea un'istanza di RecyclerView con un AttributeSet.
Come soluzione alternativa, suggerirei di creare un nuovo file di layout solo con 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" />

Ora puoi gonfiare e aggiungere RecyclerView con le barre di scorrimento ovunque tu voglia: 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
Sto usando in questo modo ora, ma grazie davvero per avermi detto il motivo!
Kevin Liu

1
Ora puoi aggiungere facilmente le barre di scorrimento! Controllare questa risposta: stackoverflow.com/a/39125108/3162918
bendaf

72

Imposta la barra di scorrimento verticale nel layout xml

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

2
È abbastanza o dobbiamo anche impostare android:scrollbarStyle="outsideOverlay"?
IgorGanapolsky

1
@IgorGanapolsky Non è necessario impostarlo, a meno che tu non voglia specificare se la barra di scorrimento sarà sovrapposta o inserita
Lilo

2
Questo in realtà non risponde alla domanda, poiché OP non utilizzava affatto il layout XML e quindi voleva averlo a livello di codice.
Andrew T.

E hai attributi opzionali comeandroid:fadeScrollbars="true"
Junior Mayhé

38

Solo nelle proprietà 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>

come si può impostare il colore dallo scorrimento? like recyclerview.scrollview.color = R.color.some_one
marlonpya

14

Preferirei usare ContextThemeWrapperper quello.

Prima definisci in Style.xml:

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

E poi ogni volta che inizializzi il tuo RecyclerView usa ContextThemeWrapper:

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

7

Puoi farlo senza gonfiare un layout XML, ma dovrai dichiarare un attributo del tema personalizzato e uno stile:

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

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

Quindi imposta il valore dell'attributo sullo stile nel tuo tema:

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

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

Ora puoi creare RecyclerView a livello di codice con una barra di scorrimento verticale:

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

1

Usa un codice come:

<androidx.recyclerview.widget.RecyclerView
 android:id="@+id/categoryRecyclerLayout"
 android:layout_width="414dp"
 android:layout_height="652dp"
 android:scrollbars="vertical" .... />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.