มีวิธีใดในการเปิดใช้งานแถบเลื่อนสำหรับ 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);

จากนั้นฉันก็เห็นสิ่งนี้ในเอกสารของ Android

ดังนั้นฉันจึงพยายามสร้าง LayoutManager ของตัวเองและแทนที่ฟังก์ชันที่ฉันคิดว่าฉันต้องการ แต่สุดท้ายฉันก็ทำไม่สำเร็จ ใครช่วยบอกทีว่าฉันควรสร้าง LayoutManager ของตัวเองได้อย่างไรหรือแค่แสดงวิธีแก้ปัญหาอื่น ๆ ขอบคุณ!

คำตอบ:


125

ในขณะนี้ดูเหมือนว่าจะไม่สามารถเปิดใช้แถบเลื่อนโดยใช้โปรแกรมได้ เหตุผลสำหรับพฤติกรรมที่เป็นที่ Android ไม่เรียกอย่างใดอย่างหนึ่งหรือView.initializeScrollbarsInternal(TypedArray a) View.initializeScrollbars(TypedArray a)วิธีการทั้งสองจะถูกเรียกก็ต่อเมื่อคุณสร้างอินสแตนซ์ RecyclerView ของคุณด้วย AttributeSet
เพื่อเป็นการแก้ปัญหาฉันขอแนะนำให้คุณสร้างไฟล์เลย์เอาต์ใหม่ด้วย 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"
Junior 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>

จะกำหนดสีจากการเลื่อนได้อย่างไร? likecyclelerview.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);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.