Recyclerview ภายในการเลื่อนแบบ Nested Scrollview แต่ไม่เลื่อนเร็วเหมือน Recyclerview ปกติหรือ Nested Scrollview


98

ฉันใช้RecyclerViewภายในNestedScrollViewและมันได้ผล แต่เมื่อฉันใช้RecyclerViewภายในLinearLayoutหรือบางสิ่งบางอย่างมันจะเลื่อนด้วยความเร็วต่างๆขึ้นอยู่กับท่าทาง การเลื่อนฟังท่าทางและถ้าฉันเลื่อนขึ้นเพียงเล็กน้อยมันก็จะเลื่อนขึ้นเล็กน้อยในขณะที่ถ้าฉันเลื่อนเร็วมากมันก็จะเลื่อนเร็วมาก ตอนนี้ปัญหาของฉันคือRecyclerViewข้างในNestedScrollViewเลื่อนอย่างแน่นอน แต่การเลื่อนอย่างรวดเร็วไม่ทำงาน อย่างไรก็ตามฉันเลื่อนขึ้นเร็วหรือช้าRecyclerViewหรือNestedScrollViewเลื่อนเพียงเล็กน้อย

ฉันจะทำให้มุมมองการเลื่อนของฉันNestedScrollViewหรือRecyclerViewภายในนั้นเลื่อนด้วยความเร็วต่างๆได้อย่างไร


3
RecyclerView.setNestedScrollingEnabled (เท็จ); ได้ผลจริง !!
Aung Si Min Htet

stackoverflow.com/questions/27083091/… Solution ได้ที่นี่
maruti060385

กรุณาใช้open fun setNestedScrollingEnabled (เปิดใช้งาน: บูลีน): หน่วยหวังว่ามันจะช่วยคุณได้
Int0TheRainb0w

คำตอบ:


266

ลอง

recyclerView.setNestedScrollingEnabled(false);

15
แต่ด้วยการตั้งค่านี้มุมมองรีไซเคิลไม่รีไซเคิลมุมมอง! คุณมีความคิดเห็นอย่างไรเกี่ยวกับเรื่องนี้
59

อันที่จริงฉันกำลังเพิ่มมุมมองรีไซเคิลอย่างน้อยสองมุมมองด้วยตัวจัดการเลย์เอาต์ที่แตกต่างกัน (เช่น Linear Layout และ Grid Layout) ภายในเลย์เอาต์ของฉันซึ่งรวมถึงแบนเนอร์และมุมมองอื่น ๆ ด้วย ดังนั้นเพื่อจัดการกับมุมมองรีไซเคิลเช่นนั้นให้วางสิ่งเหล่านี้ทั้งหมดไว้ในโปรแกรมแก้ไข Nested Scroll View
Aung Si Min Htet

25
ฉันไม่รู้ว่าคำตอบนี้ได้รับคะแนนโหวตมากขนาดไหน หากปิดการใช้งานการเลื่อนที่ซ้อนกันแสดงว่าเป็นการเอาชนะวัตถุประสงค์ จะเกิดอะไรขึ้นถ้าฉันต้องการใช้หนังสือม้วนและรีไซเคิลที่ซ้อนกัน? บางอย่างเช่น CoordinatorLayout, AppBarLayout และ RecyclerView ??
Jimit Patel

ขอบคุณ @JimitPatel นี่คือปัญหาของฉันในขณะนี้ ฉันมีมุมมองรีไซเคิลภายในมุมมองแบบซ้อนและไม่สามารถเลื่อนได้ stackoverflow.com/questions/41259756/…
Karoly

1
@ Karoly จำเป็นต้องปรับแต่งการเลื่อนแบบซ้อน ... ฉันว่า ... จะโพสต์ว่าในอีกไม่กี่ชั่วโมง ... ขณะนี้ฉันกำลังเดินทาง ฉันประสบปัญหานั้นในเอฟเฟกต์พารัลแลกซ์ด้วยมุมมองรีไซเคิลหลังแถบเครื่องมือ
Jimit Patel

53

โดยค่าเริ่มต้น setNestedScrollingEnabledงานได้หลังจาก API-21 เท่านั้น

คุณสามารถใช้ViewCompat.setNestedScrollingEnabled(recyclerView, false);ปิดการเลื่อนแบบซ้อนสำหรับก่อนและหลัง API-21 (Lollipop) ลิงก์ไปยังเอกสารเชื่อมโยงไปยังเอกสาร

หวังว่านี่จะช่วยได้!


21

ฉันกำลังทำงานบน Android 16 ซึ่งไม่สามารถใช้เมธอด setNestedSCrollEnabled ได้

สิ่งที่ฉันทำเพื่อหยุด RecyclerView จากการจัดการ Scrolls

เช่นเดียวกับใน LinerLayoutManager ฉันทำ canScrollHorizontally canScrollVertically เพื่อส่งคืนเท็จตามค่าเริ่มต้น

myRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false){
            @Override
            public boolean canScrollHorizontally() {
                return false;
            }

            @Override
            public boolean canScrollVertically() {
                return false;
            }
        });

สิ่งนี้ใช้ได้ผลจริงสำหรับฉัน ฉันมี RecyclerView ภายใน LinearLinear ภายใน ScrollView
FonzTech

9

หลังจากทำซ้ำหลายครั้งฉันก็คิดวิธีแก้ปัญหา

  1. หากคุณใช้ RecyclerView แล้ว:

    recyclerView.setNestedScrollingEnabled(false);
    
  2. หากคุณใช้ LinearLayout ภายใน NestedScrollingView ให้ใช้ LinearLayout ภายใน ScrollView ปกติจากนั้นตั้งค่าการเลื่อนไปที่

    scrollView.setNestedScrollingEnabled(false);
    

2

android: overScrollMode = "ไม่เคย

  <android.support.v4.widget.NestedScrollView
    android:id="@+id/nestedScrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:overScrollMode="never">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>
 </android.support.v4.widget.NestedScrollView>

1

คุณสามารถใช้ ScrollView กับคลาส ExtendRecyclerView ที่แทนที่เมธอด onMeasure ที่เหมาะกับฉัน!

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthSpec, expandSpec);
}

1
recyclerView.setNestedScrollingEnabled(false);

จะมีประโยชน์ในบางครั้ง แต่ไม่แนะนำให้ใช้ตลอดเวลาเพราะปิดใช้งานการดูคุณสมบัติการรีไซเคิลในมุมมอง recylcer

ทางเลือก:

ลอง CollapsiveToolbarLayout ด้วยมุมมอง Recycler ใส่มุมมองอื่น ๆ ในเค้าโครง CollsiveTollbar



-1

ในกรณีของฉันฉันวางภาพทั้งหมดไว้ในโฟลเดอร์ที่วาดได้ในโฟลเดอร์ drawable-xxxhdpi นั่นคือสาเหตุที่ UI หน้าจอของฉันล้าหลัง


-3

คุณควรรวมมุมมองรีไซเคิลในรูปแบบใด ๆ เช่น LinearLayout และตั้งค่าขนาด RecyclerView เป็นค่าคงที่เช่น 800dp วิธีนี้จะเปิดใช้งานการเลื่อนที่ราบรื่นและมุมมองรีไซเคิลจะยังคงเป็นมุมมองรีไซเคิลระหว่างการเลื่อน

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                                xmlns:app="http://schemas.android.com/apk/res-auto"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:orientation="vertical">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="800dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</LinearLayout>


1
นี่เป็นคำตอบที่ดีเนื่องจากชี้ให้เห็นถึงวิธีการแก้ไขปัญหาการเลื่อนแบบเหวี่ยงโดยไม่ทำลายประโยชน์หลักของ RecyclerView โดยโหลดเฉพาะมุมมองที่มองเห็นได้และนำกลับมาใช้ใหม่เมื่อเลื่อนออกจากสายตา ผู้คนอาจลงคะแนนเนื่องจากค่าคงที่เช่น 800dp จะไม่ทำงานในทุกขนาดหน้าจอและการวางแนว แต่ค่า layout_height สามารถคำนวณและตั้งค่าโดยใช้โปรแกรมได้ค่อนข้างยุ่ง แต่ก็ช่วยแก้ปัญหาทั้งสองได้
jk7

-3

นี่คือ WAI NestedScrollView จะวัดระดับลูกด้วย Spec "Unspecified" เด็กสามารถเติบโตได้มากเท่าที่ต้องการเช่นกัน

สิ่งนี้เท่ากับความสูงของ NSV และ RV เป็นหลัก เท่าที่เกี่ยวข้องกับ RV ก็เชื่อว่าจะแสดงอย่างสมบูรณ์

ห่อ RV ของคุณด้วย LL และเพิ่มความสูงให้กับ RV ของคุณ LL จะไม่ตั้งค่าข้อกำหนดการวัดเป็น UNSPECIFIED ดังนั้น RV จะเลื่อนอย่างถูกต้องภายในความสูงที่ตั้งไว้ของ DPs ที่คุณระบุ

ข้อเสียเพียงอย่างเดียวของวิธีนี้คือคุณจะไม่สามารถจับคู่ผู้ปกครองใน RV ของคุณได้

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