Existe-t-il un moyen d'activer les barres de défilement pour RecyclerView dans le code?

105

Comme nous l'avons vu, RecyclerView est plus efficace que ListView, je préfère donc l'utiliser dans mon projet. Mais récemment, j'ai un problème lorsque je le mets dans mon ViewGroup personnalisé. RecyclerView est facile à définir des barres de défilement en XML comme ceci:

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

Mais je ne trouve vraiment aucune méthode pour définir les barres de défilement dans le code de RecyclerView, ce que j'ai essayé est:

mRecyclerView.setVerticalScrollBarEnabled(true);

et puis j'ai vu cela dans le document d'Android.

J'ai donc essayé de créer mon propre LayoutManager et de remplacer les fonctions dont je pensais avoir besoin. Mais finalement j'ai échoué. Quelqu'un peut-il donc me dire comment créer mon propre LayoutManager ou simplement me montrer une autre solution. Je vous remercie!

Kevin Liu
la source

Réponses:

125

Pour le moment, il semble impossible d'activer les barres de défilement par programme. La raison de ce comportement est qu'Android n'appelle ni View.initializeScrollbarsInternal(TypedArray a)ni View.initializeScrollbars(TypedArray a). Les deux méthodes ne sont appelées que si vous instanciez votre RecyclerView avec un AttributeSet.
Pour contourner le problème, je suggérerais de créer un nouveau fichier de mise en page avec votre RecyclerView uniquement: 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" />

Vous pouvez maintenant gonfler et ajouter le RecyclerView avec des barres de défilement partout où vous le souhaitez: 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
la source
3
J'utilise de cette façon maintenant, mais vraiment merci de m'en avoir dit la raison!
Kevin Liu
1
Vous pouvez maintenant ajouter des barres de défilement facilement! Vérifiez cette réponse: stackoverflow.com/a/39125108/3162918
bendaf
72

Définir la barre de défilement verticale dans la mise en page XML

<android.support.v7.widget.RecyclerView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:scrollbars="vertical" />
Lilo
la source
2
Est-ce suffisant, ou devons-nous également définir android:scrollbarStyle="outsideOverlay"?
IgorGanapolsky
1
@IgorGanapolsky Pas besoin de le définir, sauf si vous souhaitez spécifier si votre barre de défilement serait superposée ou incrustée
Lilo
2
Cela ne répond pas vraiment à la question, car OP n'utilisait pas du tout la mise en page XML et souhaitait donc l'avoir par programme.
Andrew T.24
Et vous avez des attributs optionnels tels queandroid:fadeScrollbars="true"
Junior Mayhé
38

Juste dans les propriétés 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 Sunny
la source
comment définir la couleur par défilement? comme recyclerview.scrollview.color = R.color.some_one
marlonpya
14

Je préférerais utiliser ContextThemeWrapperpour cela.

Définissez d'abord dans Style.xml:

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

Et puis chaque fois que vous initialisez votre utilisation RecyclerView ContextThemeWrapper:

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

Vous pouvez le faire sans gonfler une mise en page XML, mais vous devrez déclarer un attribut de thème personnalisé et un style:

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

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

Ensuite, définissez la valeur de l'attribut sur le style de votre thème:

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

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

Vous pouvez maintenant créer le RecyclerView par programme avec une barre de défilement verticale:

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

Utilisez un code comme:

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