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!
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);
}
}
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" />
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>
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));
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);