코드에서 RecyclerView의 스크롤바를 활성화하는 방법이 있습니까?


105

우리가 보았 듯이 RecyclerView는 ListView보다 효과적이므로 내 프로젝트에서 사용하는 것을 선호합니다. 하지만 최근에 사용자 정의 ViewGroup에 넣을 때 문제가 있습니다. RecyclerView는 다음과 같이 xml에서 스크롤바를 쉽게 설정할 수 있습니다.

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

하지만 RecyclerView에 대한 코드에서 스크롤 막대를 설정하는 방법을 실제로 찾을 수 없습니다.

mRecyclerView.setVerticalScrollBarEnabled(true);

그리고 나는 보았다 안드로이드의 문서에.

그래서 내 자신의 LayoutManager를 만들고 내가 필요하다고 생각하는 기능을 재정의하려고했습니다. 하지만 마침내 실패했습니다. 그래서 누구든지 내 LayoutManager를 만드는 방법을 알려주거나 다른 솔루션을 보여줄 수 있습니다. 감사합니다!

답변:


125

현재로서는 스크롤바를 프로그래밍 방식으로 활성화하는 것이 불가능 해 보입니다. 그 이유는 Android가 View.initializeScrollbarsInternal(TypedArray a)또는 View.initializeScrollbars(TypedArray a). 두 메서드는 AttributeSet으로 RecyclerView를 인스턴스화하는 경우에만 호출됩니다.
해결 방법으로 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" />

이제 원하는 곳 어디에서나 스크롤바를 사용하여 RecyclerView를 확장하고 추가 할 수 있습니다. 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
지금은 이런 식으로 사용하고 있지만 그 이유를 알려 주셔서 정말 감사합니다!
Kevin Liu

1
이제 스크롤바를 쉽게 추가 할 수 있습니다! 이 답변을 확인하십시오 : stackoverflow.com/a/39125108/3162918
bendaf

72

xml 레이아웃에서 수직 스크롤바 설정

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

2
이것으로 충분합니까, 아니면 우리도 설정 android:scrollbarStyle="outsideOverlay"해야합니까?
IgorGanapolsky

1
@IgorGanapolsky 스크롤바를 오버레이할지 삽입할지 지정하지 않는 한 설정할 필요가 없습니다.
Lilo

2
OP는 XML 레이아웃을 전혀 사용하지 않았기 때문에 이것은 실제로 질문에 대한 답이 아닙니다.
Andrew T.

그리고 당신은 다음과 같은 선택적 속성이android:fadeScrollbars="true"
주니어 Mayhé을

38

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>

스크롤로 색상을 어떻게 설정할 수 있습니까? like recyclerview.scrollview.color = R.color.some_one
marlonpya

14

나는 그것을 사용 ContextThemeWrapper하고 싶습니다 .

먼저 Style.xml에서 정의하십시오.

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

그리고 RecyclerView를 초기화 할 때마다 다음을 사용합니다 ContextThemeWrapper.

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

7

XML 레이아웃을 확장하지 않고도 할 수 있지만 사용자 지정 테마 속성과 스타일을 선언해야합니다.

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

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

그런 다음 속성 값을 테마의 스타일로 설정하십시오.

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

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

이제 수직 스크롤바를 사용하여 프로그래밍 방식으로 RecyclerView를 만들 수 있습니다.

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

1

다음과 같은 코드를 사용하십시오.

<androidx.recyclerview.widget.RecyclerView
 android:id="@+id/categoryRecyclerLayout"
 android:layout_width="414dp"
 android:layout_height="652dp"
 android:scrollbars="vertical" .... />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.