Apakah ada cara untuk mengaktifkan scrollbar untuk RecyclerView dalam kode?

105

Seperti yang kita lihat, RecyclerView lebih efektif daripada ListView, jadi saya lebih suka menggunakannya dalam proyek saya. Namun baru-baru ini saya mengalami masalah saat memasukkannya ke dalam ViewGroup kustom saya. RecyclerView mudah untuk mengatur scrollbar dalam xml seperti ini:

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

Tetapi saya benar-benar tidak dapat menemukan metode apa pun untuk mengatur scrollbar dalam kode untuk RecyclerView, yang telah saya coba adalah:

mRecyclerView.setVerticalScrollBarEnabled(true);

dan kemudian saya melihat ini di dokumen Android.

Jadi saya mencoba membuat LayoutManager saya sendiri dan mengganti fungsi yang saya pikir saya perlukan. Tapi akhirnya saya gagal. Jadi adakah yang bisa memberi tahu saya bagaimana saya harus membuat LayoutManager saya sendiri atau cukup tunjukkan solusi lain. Terima kasih!

Kevin Liu
sumber

Jawaban:

125

Saat ini tampaknya mustahil untuk mengaktifkan bilah gulir secara terprogram. Alasan perilaku tersebut adalah karena Android tidak memanggil View.initializeScrollbarsInternal(TypedArray a)atau View.initializeScrollbars(TypedArray a). Kedua metode tersebut hanya dipanggil jika Anda membuat instance RecyclerView dengan AttributeSet.
Sebagai solusinya, saya sarankan, Anda membuat file tata letak baru dengan hanya 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" />

Sekarang Anda dapat memekarkan dan menambahkan RecyclerView dengan bilah gulir di mana pun Anda inginkan: 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);
    }
}
pengguna1185087
sumber
3
Saya menggunakan cara ini sekarang, tetapi terima kasih telah memberi tahu saya alasannya!
Kevin Liu
1
Sekarang Anda dapat menambahkan scrollbar dengan mudah! Periksa jawaban ini: stackoverflow.com/a/39125108/3162918
bendaf
72

Atur scrollbar vertikal dalam tata letak xml

<android.support.v7.widget.RecyclerView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:scrollbars="vertical" />
Lil o
sumber
2
Apakah ini cukup, ataukah kita juga harus mengaturnya android:scrollbarStyle="outsideOverlay"?
IgorGanapolsky
1
@IgorGanapolsky Tidak perlu mengaturnya, kecuali jika Anda ingin menentukan apakah scrollbar Anda akan dilapisi atau inset
Lilo
2
Ini tidak benar-benar menjawab pertanyaan, karena OP tidak menggunakan tata letak XML sama sekali dan dengan demikian, ingin memiliki ini secara terprogram.
Andrew T.
Dan Anda memiliki atribut opsional sepertiandroid:fadeScrollbars="true"
Junior Mayhé
38

Hanya di properti 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
sumber
bagaimana mengatur warna dari dengan gulir? seperti recyclerview.scrollview.color = R.color.some_one
marlonpya
14

Saya lebih suka menggunakan ContextThemeWrapperuntuk itu.

Pertama-tama tentukan di Style.xml:

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

Dan setiap kali Anda menginisialisasi penggunaan RecyclerView ContextThemeWrapper:

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

Anda dapat melakukannya tanpa meluaskan tata letak XML, tetapi Anda harus mendeklarasikan atribut tema khusus dan gaya:

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

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

Kemudian setel nilai atribut ke gaya di tema Anda:

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

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

Sekarang Anda dapat membuat RecyclerView secara terprogram dengan scrollbar vertikal:

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

Gunakan kode seperti:

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