ScrollView içindeki geri dönüşüm görünümü düzgün şekilde kaydırılmıyor


179

Uygulamam için bu kütüphaneyi kullanarak içeriğine göre yüksekliği olan bir RecyclerViewiç mekan kullanıyorum . Kaydırma çalışıyor ancak üzerinde ilerlediğimde düzgün çalışmıyor . Kendi üzerine geldiğimde düzgün bir şekilde ilerliyor.ScrollViewRecyclerViewRecyclerViewScrollView

Tanımlamak için kullanıyorum kodu RecyclerView:

LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));

RecyclerViewiçinde ScrollView:

<android.support.v7.widget.RecyclerView
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"
    android:id="@+id/friendsList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

Bu çözüm benim için çalışıyor: stackoverflow.com/a/32390370/7308789 teşekkür ederim
Houssin Boulla

1
@tahaDev davanızda tam olarak neyin işe yaramadığını lütfen daha ayrıntılı olarak açıklayın. Ayrıca, durumunuzda sağlanan hiçbir çözüm işe yaramadı gibi görünüyor, öyle mi?
Pravin Divraniya

androidx.constraintlayout.widget.ConstraintLayoutSorununuzu karmaşık uygulamalar olmadan çözecek kullanım
Saswata

Yanıtlar:


379

Yapmayı dene:

RecyclerView v = (RecyclerView) findViewById(...);
v.setNestedScrollingEnabled(false);

Alternatif olarak, destek tasarım kitaplığını kullanarak düzeninizi değiştirebilirsiniz. Mevcut düzeniniz sanırım:

<ScrollView >
   <LinearLayout >

       <View > <!-- upper content -->
       <RecyclerView > <!-- with custom layoutmanager -->

   </LinearLayout >
</ScrollView >

Bunu şu şekilde değiştirebilirsiniz:

<CoordinatorLayout >

    <AppBarLayout >
        <CollapsingToolbarLayout >
             <!-- with your content, and layout_scrollFlags="scroll" -->
        </CollapsingToolbarLayout >
    </AppBarLayout >

    <RecyclerView > <!-- with standard layoutManager -->

</CoordinatorLayout >

Ancak bu daha uzun bir yoldur ve özel doğrusal mizanpaj yöneticisi ile sorun yaşıyorsanız, geri dönüşümcü görünümünde iç içe kaydırmayı devre dışı bırakın.

Düzenle (03.04.2016)

v 23.2Destek kütüphanelerinin bırakma şimdi tüm varsayılan bir fabrika “sarma içeriği” özelliği içerir LayoutManagers. Test etmedim, ama muhtemelen kullandığınız kütüphaneye tercih etmelisiniz.

<ScrollView >
   <LinearLayout >

       <View > <!-- upper content -->
       <RecyclerView > <!-- with wrap_content -->

   </LinearLayout >
</ScrollView >

16
Bu cevaba eklemek için: setNestedScrollingEnabled(false)sadece bunun yerine ScrollViewbir anahtarını kapattığımda çalıştı NestedScrollView.
Richard Le Mesurier

11
Benim için, setNestedScrollingEnabled(false)bana geri birlikte kaydırma pürüzsüz verdi RecyclerViewbir iç ScrollViewteşekkür -! Ama hala neden işe yaradığını anlamıyorum ...? İç içe kaydırma yanlış ayarlamak gerçekten ne anlama geliyor?
Micro

33
Not android:nestedScrollingEnabled="false"sadece API için çalışır 21+ ancak v.setNestedScrollingEnabled(false)<21 için sorun yok.
Eric

3
İleride RecyclerViewbaşvurmak üzere, içinde sadece hatmi / nuga (API 23, 24) cihazlarda ScrollViewolan wrap_content sorunu yaşıyorsa , geçici
çözümümü

2
Şu anda deneyimlediğim bu çözümün bir dezavantajı, RecyclerView'ın onScrollListener'daki olayları almamasıdır. Hangi ihtiyacım var çünkü daha fazla veri almak istiyorum çünkü ben geri dönüşüm sadece belirli bir miktarda öğe var
Daniel W.

82

Sadece bunu kullanmam gerekiyordu:

mMyRecyclerView.setNestedScrollingEnabled(false);

benim .. De onCreateView() yöntemim.

Çok teşekkürler!


26

Bu şekilde aşağıdakilerden birini kullanabilirsiniz:

Bu satırı recyclerView xml dosyanıza ekleyin:

android:nestedScrollingEnabled="false"

Veya java kodunda:

RecyclerView.setNestedScrollingEnabled(false);

Umarım bu yardımcı olmuştur.


10
gerektirir Api 21+
Muhammed Riyaz

11

Her iki yolu da XML ile ve programlı olarak deneyebilirsiniz. Ancak karşılaşabileceğiniz sorun (API 21'in altında) XML ile yaparak çalışmaz. Etkinlik / Parçanızda programlı olarak ayarlamak daha iyidir.

XML kodu:

<android.support.v7.widget.RecyclerView
      android:id="@+id/recycleView"
      android:layout_width="match_parent"
      android:visibility="gone"
      android:nestedScrollingEnabled="false"
      android:layout_height="wrap_content"
      android:layout_below="@+id/linearLayoutBottomText" /> 

Programlı:

 recycleView = (RecyclerView) findViewById(R.id.recycleView);
 recycleView.setNestedScrollingEnabled(false);

6

Kaydırma Görünümü yerine Yuvalanmış Kaydırma Görünümü'nü kullanmak sorunumu çözdü

<LinearLayout> <!--Main Layout -->
   <android.support.v4.widget.NestedScrollView>
     <LinearLayout > <!--Nested Scoll View enclosing Layout -->`

       <View > <!-- upper content --> 
       <RecyclerView >


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

5

Benzer sorunlar yaşadım (Google PlayStore tasarımı gibi iç içe bir RecyclerViews oluşturmaya çalıştım). Bununla başa çıkmanın en iyi yolu, alt RecyclerViews alt sınıfını oluşturmak ve 'onInterceptTouchEvent' ve 'onTouchEvent' yöntemlerini geçersiz kılmaktır. Bu şekilde, bu olayların nasıl davrandığı ve nihayetinde kaydırma üzerinde tam kontrol sahibi olursunuz.


3

ScrollView'ın NestedScrollView ile değiştirilmesi, tabana düzgün kaydırma yapılmasına neden oldu.


1

Çocuk görüntülerinizde VideoView veya ağır ağırlık widget'ları kullanıyorsanız RecyclerView'ınızı yükseklikle wrap_content birlikte NestedScrollView ile yükseklik içinde tutunmatch_parent Sonra kaydırma, istediğiniz kadar sorunsuz çalışır.

Bilginize,

<android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:nestedScrollingEnabled="false"
            android:layout_height="wrap_content"
            android:clipToPadding="false" />

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

Teşekkürler Micro, bu ipucundan oldu!

karthik


1

Tüm cevapların özeti (Avantajlar ve Dezavantajlar)

Tek geri dönüşüm görünümü için

Koordinatör düzeni içinde kullanabilirsiniz.

Avantaj - tüm geri dönüşüm görüntüleme öğelerini yüklemez. Çok düzgün yükleme.

Dezavantajı - Koordinatör düzeni içine iki geri dönüşüm görünümü yükleyemezsiniz - kaydırma sorunları oluşturur

referans - https://stackoverflow.com/a/33143512/3879847

Minimum satır içeren çoklu görüntüleyici görüntüleme için

NestedScrollView içine yükleyebilirsiniz

Avantaj - sorunsuz kaydırır

Dezavantaj - Tüm geri dönüşüm görüntüleme satırlarını yükler, böylece etkinliğiniz gecikmeli olarak açılır

referans - https://stackoverflow.com/a/33143512/3879847

Büyük satırlara sahip birden çok yeniden görüntüleme için (100'den fazla)

Geri dönüşüm görünümü ile gitmelisiniz.

Avantaj - Sorunsuz kaydırın, düzgün yükleyin

Dezavantaj - Daha fazla kod ve mantık yazmanız gerekir

Her tekrar görüşmeyi çoklu görüntüleyicilerin yardımıyla ana geri dönüşüm görünümüne yükleyin

örn:

MainRecyclerview

-ChildRecyclerview1 (ViewHolder1)

-ChildRecyclerview2 (ViewHolder2)

-ChildRecyclerview3 (ViewHolder3) 

-Any other layout   (ViewHolder4)

Multi-viewHolder için referans - https://stackoverflow.com/a/26245463/3879847


0

XML kodu:

<android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clipToPadding="false" />

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

java kodunda:

  recycleView = (RecyclerView) findViewById(R.id.recycleView);
     recycleView.setNestedScrollingEnabled(false);

0

Veya yalnızca android:focusableInTouchMode="true"geri dönüşümcü görünümünüzde ayarlayabilirsiniz


0
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent">

            <android.support.constraint.ConstraintLayout
                android:id="@+id/constraintlayout_main"
                android:layout_width="match_parent"
                android:layout_height="@dimen/layout_width_height_fortyfive"
                android:layout_marginLeft="@dimen/padding_margin_sixteen"
                android:layout_marginRight="@dimen/padding_margin_sixteen"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent">

                <TextView
                    android:id="@+id/textview_settings"
                    style="@style/textviewHeaderMain"
                    android:gravity="start"
                    android:text="@string/app_name"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent" />

            </android.support.constraint.ConstraintLayout>

            <android.support.constraint.ConstraintLayout
                android:id="@+id/constraintlayout_recyclerview"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/padding_margin_zero"
                android:layout_marginTop="@dimen/padding_margin_zero"
                android:layout_marginEnd="@dimen/padding_margin_zero"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/constraintlayout_main">

                <android.support.v7.widget.RecyclerView
                    android:id="@+id/recyclerview_list"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:nestedScrollingEnabled="false"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent" />

            </android.support.constraint.ConstraintLayout>

        </android.support.constraint.ConstraintLayout>

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

</android.support.constraint.ConstraintLayout>

Bu kod ConstraintLayout android için çalışıyor


0

Kotlin

Set isNestedScrollingEnablediçin falsekaydırma görünümü altında her RecyclerView için

val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.isNestedScrollingEnabled = false

XML Düzenini Kullanma

<android.support.v7.widget.RecyclerView
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"
    android:id="@+id/friendsList"
    android:layout_width="match_parent"
    android:nestedScrollingEnabled="false"
    android:layout_height="wrap_content" />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.