Có cách nào để bật thanh cuộn cho RecyclerView trong mã không?


105

Như chúng ta đã thấy, RecyclerView hiệu quả hơn ListView, vì vậy tôi thích sử dụng nó trong dự án của mình hơn. Nhưng gần đây tôi gặp sự cố khi đặt nó vào ViewGroup tùy chỉnh của mình. RecyclerView dễ dàng đặt thanh cuộn trong xml như sau:

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

Nhưng tôi thực sự không thể tìm thấy bất kỳ phương pháp nào để đặt thanh cuộn trong mã cho RecyclerView, những gì tôi đã thử là:

mRecyclerView.setVerticalScrollBarEnabled(true);

và sau đó tôi thấy điều này trong tài liệu của Android.

Vì vậy, tôi đã cố gắng tạo LayoutManager của riêng mình và ghi đè các chức năng mà tôi nghĩ tôi cần. Nhưng cuối cùng tôi đã thất bại. Vì vậy, bất cứ ai có thể cho tôi biết làm thế nào tôi nên tạo LayoutManager của riêng mình hoặc chỉ cho tôi một giải pháp khác. Cảm ơn bạn!

Câu trả lời:


125

Hiện tại, dường như không thể bật thanh cuộn theo chương trình. Lý do cho hành vi đó là Android không gọi View.initializeScrollbarsInternal(TypedArray a)hoặc View.initializeScrollbars(TypedArray a). Cả hai phương thức chỉ được gọi nếu bạn khởi tạo RecyclerView của mình bằng AttributeSet.
Một cách giải quyết khác mà tôi khuyên bạn nên tạo một tệp bố cục mới chỉ với RecyclerView của mình: 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" />

Bây giờ bạn có thể tăng cường và thêm RecyclerView với thanh cuộn ở mọi nơi bạn muốn: 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);
    }
}

3
Tôi đang sử dụng cách này bây giờ, nhưng thực sự cảm ơn vì đã cho tôi biết lý do!
Kevin Liu

1
Bây giờ bạn có thể thêm thanh cuộn một cách dễ dàng! Kiểm tra câu trả lời này: stackoverflow.com/a/39125108/3162918
bendaf

72

Đặt thanh cuộn dọc trong bố cục xml

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

2
Điều này là đủ, hay chúng ta cũng phải thiết lập android:scrollbarStyle="outsideOverlay"?
IgorGanapolsky

1
@IgorGanapolsky Không cần đặt nó, trừ khi bạn muốn chỉ định xem thanh cuộn của mình sẽ được phủ lên hay bị chèn
Lilo

2
Điều này không thực sự trả lời câu hỏi, vì OP hoàn toàn không sử dụng bố cục XML và do đó, muốn có điều này theo chương trình.
Andrew T.

Và bạn có các thuộc tính tùy chọn nhưandroid:fadeScrollbars="true"
Junior Mayhé

38

Chỉ trong thuộc tính 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>

làm thế nào có thể đặt màu từ bằng cách cuộn? như recyclerview.scrollview.color = R.color.some_one
marlonpya

14

Tôi muốn sử dụng ContextThemeWrappercho điều đó.

Đầu tiên xác định trong Style.xml:

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

Và sau đó bất cứ khi nào bạn khởi tạo việc sử dụng RecyclerView của mình ContextThemeWrapper:

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

7

Bạn có thể làm điều đó mà không cần tăng cường bố cục XML, nhưng bạn sẽ cần phải khai báo một thuộc tính chủ đề tùy chỉnh và một kiểu:

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

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

Sau đó, đặt giá trị của thuộc tính thành kiểu trong chủ đề của bạn:

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

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

Bây giờ bạn có thể tạo RecyclerView theo lập trình với thanh cuộn dọc:

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

1

Sử dụng mã như:

<androidx.recyclerview.widget.RecyclerView
 android:id="@+id/categoryRecyclerLayout"
 android:layout_width="414dp"
 android:layout_height="652dp"
 android:scrollbars="vertical" .... />
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.