Existe alguma maneira de habilitar barras de rolagem para RecyclerView no código?

105

Como vimos, o RecyclerView é mais eficaz do que o ListView, então prefiro usá-lo no meu projeto. Mas recentemente tive um problema ao colocá-lo no meu ViewGroup personalizado. O RecyclerView é fácil de definir barras de rolagem em xml como este:

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

Mas eu realmente não consigo encontrar nenhum método para definir as barras de rolagem no código para RecyclerView, o que tentei é:

mRecyclerView.setVerticalScrollBarEnabled(true);

e então eu vi isso no documento do Android.

Então tentei fazer meu próprio LayoutManager e substituir as funções que achei que precisava. Mas finalmente eu falhei. Então, alguém pode me dizer como devo fazer meu próprio LayoutManager ou apenas me mostrar uma outra solução. Obrigado!

Kevin Liu
fonte

Respostas:

125

No momento, parece impossível habilitar as barras de rolagem de forma programática. A razão para esse comportamento é que o Android não chama View.initializeScrollbarsInternal(TypedArray a)ou View.initializeScrollbars(TypedArray a). Ambos os métodos são chamados apenas se você instanciar seu RecyclerView com um AttributeSet.
Como solução alternativa, sugiro que você crie um novo arquivo de layout apenas com o 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" />

Agora você pode aumentar e adicionar o RecyclerView com barras de rolagem em qualquer lugar que desejar: 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
fonte
3
Estou usando dessa forma agora, mas muito obrigado por me dizer o motivo!
Kevin Liu
1
Agora você pode adicionar barras de rolagem facilmente! Verifique esta resposta: stackoverflow.com/a/39125108/3162918
bendaf
72

Defina a barra de rolagem vertical no layout xml

<android.support.v7.widget.RecyclerView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:scrollbars="vertical" />
Lilo
fonte
2
Isso é suficiente ou nós também temos que definir android:scrollbarStyle="outsideOverlay"?
IgorGanapolsky
1
@IgorGanapolsky Não há necessidade de defini-lo, a menos que você queira especificar se sua barra de rolagem seria sobreposta ou inserida
Lilo
2
Isso realmente não responde à pergunta, uma vez que OP não usava layout XML e, portanto, queria ter isso programaticamente.
Andrew T.
E você tem atributos opcionais, comoandroid:fadeScrollbars="true"
Junior Mayhé
38

Apenas em propriedades 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
fonte
como definir a cor por meio de rolagem? como recyclerview.scrollview.color = R.color.some_one
marlonpya
14

Eu preferiria usar ContextThemeWrapper para isso.

Defina primeiro em Style.xml:

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

E então, sempre que você inicializar o uso do RecyclerView ContextThemeWrapper:

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

Você pode fazer isso sem aumentar um layout XML, mas precisará declarar um atributo de tema personalizado e um estilo:

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

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

Em seguida, defina o valor do atributo para o estilo em seu tema:

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

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

Agora você pode criar o RecyclerView programaticamente com uma barra de rolagem vertical:

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

Use um código como:

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