web-dev-qa-db-fra.com

Est-il possible d'activer les barres de défilement pour RecyclerView dans le code?

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 à configurer les barres de défilement au format 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. Voici ce que j'ai essayé:

mRecyclerView.setVerticalScrollBarEnabled(true);

et puis j'ai vu this 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é. Alors quelqu'un peut-il me dire comment créer mon propre LayoutManager ou simplement me montrer une autre solution? Je vous remercie!

92
Kevin Liu

Pour le moment, il semble impossible d'activer les barres de défilement par programmation. La raison de ce comportement est que 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.
En guise de solution de contournement, je vous suggère 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);
    }
}
110
user1185087

Définir la barre de défilement verticale dans la présentation XML

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

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>
28
Dinesh Sunny

Je préférerais utiliser ContextThemeWrapper pour cela.

Définissez d'abord dans Style.xml:

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

Et ensuite, chaque fois que vous initialisez votre RecyclerView, utilisez ContextThemeWrapper:

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

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>

Définissez ensuite 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>

Maintenant, vous pouvez créer le RecyclerView par programme avec une barre de défilement verticale:

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