NestedScrollView içinde RecyclerView nasıl kullanılır?


210

RecyclerViewİçeride nasıl kullanılır NestedScrollView? RecyclerViewbağdaştırıcı ayarlandıktan sonra içerik görünmez.

UPDATE düzen kodu güncellendi.

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

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="@dimen/keyline_1">

    </RelativeLayout>

    <View
        android:id="@+id/separator"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#e5e5e5" />

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

</LinearLayout>

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


@Mecid ScrollView (veya NestedScrollView) içinde RecyclerView kullanmanın bir nedeni yoktur.
Gabriele Mariotti

2
@Ancak kaydırılabilir bir görünümü asla başka bir kaydırılabilir görünümün içine koymamalısınız. Android'de genel bir kuraldır.
Gabriele Mariotti

6
@GabrieleMariotti bu kuralı biliyorum, ancak NestedScrollView bu sorunu gidermek için geliştirildi.
Mecid

1
Doğru değil. NestedScrollView, ScrollView gibidir, ancak hem iç içe kaydırma üst öğesi hem de alt öğe olarak davranmayı destekler. Sizin durumunuzda kendi kaydırma davranışınızı tanımlamanız gerekir.
Gabriele Mariotti

Yanıtlar:


216

RecyclerView cihazınızı,

<android.support.v7.widget.RecyclerView
    android:id="@+id/conversation"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

buraya,

app:layout_behavior="@string/appbar_scrolling_view_behavior"

diğer şeyleri yönetecek.

Bir şey daha var, geri dönüştürücünüzü NestedScrollView'ın içine koymanıza gerek yok


33
Bu çözümün neden en yüksek oyu alamadığını anlayamıyorum. Sadece ile NestedScrollViewdeğil app:layout_behavior="@string/appbar_scrolling_view_behavior". Bu anahtar!
hata

3
@RahulUpadhyay bu benim için çalıştı, ama son satırın yanlış olduğunu düşünüyorum, RecyclerView bir NestedScrollView içinde ise hiç göstermez. Ancak, bir süper yıldızsın: D
Leon

3
İşe yarıyor! sadece recyclerview kütüphanesini güncelleyin 'com.android.support:recyclerview-v7:+' derleyin
Fabio Guerra

28
Bu çözüm ile kullanılacak amaçlanmıştır CoordinatorLayout, AppBarLayoutve uygun düzgün ayarı layout_scrollFlagsile kaydırılmalıdır çocuk görünümünde (ler) RecyclerView. Bunun neden cevaptan çıkarıldığından emin değilim. Aksi takdirde, bu güzel ve basit bir çözümdür.
Sanvywell

9
Bence RecyclerView'in GERİ DÖNÜŞÜMÜNÜN burada ÇALIŞMADIĞINI anlamak çok önemli. Sonuç olarak, uzun bir öğe listeniz varsa, fark edilir bir kullanıcı arayüzü dondurmasıyla görünecektir.
Gaket

121

GÜNCELLEME 1

Android Destek Kütüphanesi 23.2.0'dan beri setAutoMeasureEnabled(true)LayoutManagers için bir yöntem eklendi . RecyclerView'in içeriğini sarmasını sağlar ve bir cazibe gibi çalışır.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

Yani böyle bir şey ekleyin:

    LayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setAutoMeasureEnabled(true);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setNestedScrollingEnabled(false);


GÜNCELLEME 2

27.1.0 setAutoMeasureEnabledkullanımdan kaldırıldığından, LayoutManager'ın geçersiz kılınmış yöntemle özel uygulamasını sağlamalısınızisAutoMeasureEnabled()

Ancak RecyclerView birçok kullanımdan sonra, sarma modunda kullanmamanızı şiddetle tavsiye ederim , çünkü bu amaçlandığı gibi değildir. Birkaç öğenin türüyle normal tek RecyclerView kullanarak tüm düzeninizi yeniden düzenlemeye çalışın. Veya aşağıda son çare olarak tanımladığım LinearLayout ile yaklaşımı kullanın


Eski cevap (önerilmez)

Sen kullanabilirsiniz RecyclerViewiçini NestedScrollView. Her şeyden önce sen kendi özel uygulamalıdır LinearLayoutManager, bu sizin kılan RecyclerViewiçeriğini sarmak için. Örneğin:

public class WrappingLinearLayoutManager extends LinearLayoutManager
{

    public WrappingLinearLayoutManager(Context context) {
        super(context);
    }

    private int[] mMeasuredDimension = new int[2];

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

    @Override
    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
            int widthSpec, int heightSpec) {
        final int widthMode = View.MeasureSpec.getMode(widthSpec);
        final int heightMode = View.MeasureSpec.getMode(heightSpec);

        final int widthSize = View.MeasureSpec.getSize(widthSpec);
        final int heightSize = View.MeasureSpec.getSize(heightSpec);

        int width = 0;
        int height = 0;
        for (int i = 0; i < getItemCount(); i++) {
            if (getOrientation() == HORIZONTAL) {
                measureScrapChild(recycler, i,
                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                        heightSpec,
                        mMeasuredDimension);

                width = width + mMeasuredDimension[0];
                if (i == 0) {
                    height = mMeasuredDimension[1];
                }
            } else {
                measureScrapChild(recycler, i,
                        widthSpec,
                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                        mMeasuredDimension);

                height = height + mMeasuredDimension[1];
                if (i == 0) {
                    width = mMeasuredDimension[0];
                }
            }
        }

        switch (widthMode) {
            case View.MeasureSpec.EXACTLY:
                width = widthSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        switch (heightMode) {
            case View.MeasureSpec.EXACTLY:
                height = heightSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        setMeasuredDimension(width, height);
    }

    private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
            int heightSpec, int[] measuredDimension) {

        View view = recycler.getViewForPosition(position);
        if (view.getVisibility() == View.GONE) {
            measuredDimension[0] = 0;
            measuredDimension[1] = 0;
            return;
        }
        // For adding Item Decor Insets to view
        super.measureChildWithMargins(view, 0, 0);
        RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
        int childWidthSpec = ViewGroup.getChildMeasureSpec(
                widthSpec,
                getPaddingLeft() + getPaddingRight() + getDecoratedLeft(view) + getDecoratedRight(view),
                p.width);
        int childHeightSpec = ViewGroup.getChildMeasureSpec(
                heightSpec,
                getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view),
                p.height);
        view.measure(childWidthSpec, childHeightSpec);

        // Get decorated measurements
        measuredDimension[0] = getDecoratedMeasuredWidth(view) + p.leftMargin + p.rightMargin;
        measuredDimension[1] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin;
        recycler.recycleView(view);
    }
}

Bundan sonra LayoutManagersizin için kullanınRecyclerView

recyclerView.setLayoutManager(new WrappingLinearLayoutManager(getContext()));

Ancak bu iki yöntemi de çağırmalısınız:

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);

Burada setNestedScrollingEnabled(false)kaydırmayı devre dışı RecyclerViewbırakın, böylece kaydırma olayını durdurmaz NestedScrollView. Ve setHasFixedSize(false)adaptör içeriğindeki değişikliklerin, cihazınRecyclerView

Önemli not: Bu çözüm bazı durumlarda biraz buggy ve perfomance ile ilgili sorunları var, bu nedenle, öğenizde çok fazla öğe varsa , liste görünümünün RecyclerViewözel LinearLayouttabanlı uygulamasını kullanmanızı , bunun için Adaptör analogunu oluşturmanızı ve bunu yapmanızı öneririm gibi davran ListViewya daRecyclerView


19
Dikkat! Çok fazla ürününüz varsa bunu kullanmayın RecyclerView.
Brais Gabin

1
@BraisGabin, haklısın: setHasFixedSize (false), RecyclerView'ın birden çok yenilenmesine neden olur, bu nedenle çok fazla öğe varsa, çok yavaş çalışır. Bu durumlarda, ListView veya RecyclerView gibi davranmasını sağlamak için bir tür özel "adaptör" ile
LinearLayout kullanıyorum

1
Çok teşekkürler! Beni saatlerce kurtardı. Bu arada, son öğe dekorasyonu bu mizanpaj yöneticisi ile (ve sadece bu ile) görüntülenmiyor, olası hata?
Jjang

2
setAutoMeasureEnabled, API düzeyi 27.1.0 geliştiricisi
Dika

2
yerine geçersiz boolean isAutoMeasureEnabled (). Düzenin ölçüm geçişinin RecyclerView öğesinin AutoMeasure mekanizmasını kullanıp kullanmayacağını veya LayoutManager'ın onMeasure uygulaması (Recycler, State, int, int) tarafından yapılması gerekip gerekmediğini döndürür. Bu yöntem varsayılan olarak false değerini döndürür (aslında kullanımdan kaldırılan setAutoMeasureEnabled'a (boolean) iletilen değeri döndürür) ve bir LayoutManager RecyclerView tarafından otomatik olarak ölçülmek istiyorsa true değerini döndürmek için geçersiz kılınmalıdır. True döndürmek için bu yöntem geçersiz kılınmışsa, onMeasure (Recycler, State, int, int) geçersiz kılınmamalıdır.
Peterstev Uremgba

100

1) Yukarıdaki 23.2.0 (veya) destek kitaplığını kullanmanız gerekir

2) ve RecyclerViewyükseklik olacaktır wrap_content.

3) recyclerView.setNestedScrollingEnabled(false)

Ancak bunu yaparak geri dönüşüm modeli çalışmaz . (yani tüm görünümler bir kerede yüklenecektir, çünkü wrap_contenttam yüksekliğe ihtiyaç duyar, RecyclerViewbu nedenle tüm alt Views at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to usegörünümü çizecektirType and add all other views that need to scroll toRecyclerView rather than usingRecyclerView inScrollview`. Performans etkisi çok yüksek olacaktır.

Basitleştirmek için "sadece LinearLayouttüm çocuk görüşlerinde olduğu gibi davranır "


6
Teşekkürler @Ashok. Ayarı recyclerView.setNestedScrollingEnabled(false)düzgün bir kaydırma yapmama yardımcı oldu.
Shubhral

3
Bu kabul edilen cevap olmalı! çünkü hiçbir görünümün geri dönüştürülmeyeceğini ve tüm görünümün aynı anda çizileceğini belirtin.
M'hamed

3
@ AshokVarma, şimdi karşılaştığım aynı sorun. ancak kaydırma recyclerView içinde iyi çalışıyor ama ben recyclerview için sonsuz kaydırma uygulayamadı çünkü web hizmetini aramaya devam etmek yol açar recyclerview tüm görünümleri bir kerede çizer. peki bunu nasıl halledebilirim?
Anantha Babu

@AnanthaBabu, bir kaydırma görünümünde geri dönüşüm görünümü kullanmak yerine. kaydırma görünümündeki tüm öğeleri geri dönüşüm görünümündeki öğelere dönüştürün. geri dönüşüm görünümleri görünüm türünü kullanabilir ve farklı düzenleri boyayabilirsiniz. Bunları da işlemek için bazı iyi kütüphaneler vardır (Gerçekten karmaşık görünüm yapınız varsa ve yeniden kullanılabilir bileşenler istiyorsanız kütüphaneleri kullanın).
Ashok Varma

1
@ AshokVarma geri dönüşüm davranış sorununa herhangi bir çözüm var mı? Recyclerview'in tüm çocukları tek seferde çizmesini istemiyorum.
andro-girl

36

Sen kullanabilirsiniz android:fillViewport="true"yapmak NestedScrollViewölçmek RecyclerView. RecyclerViewKalan yüksekliğini dolduracaktır. böylece kaydırmak NestScrollViewistiyorsanız, RecyclerView's minHeight.


14
200 öğenin geri dönüşüm görünümüne sahipseniz ve bunu yaparsanız, nestedscrollview 200 öğenin tamamını dolduracak şekilde genişler!
RJFares

1
@RJFares Bu asla olmadı. Bir demo deniyorum ve düzeni incelemek için LayoutInspector kullanıyorum, sadece iyi çalışıyor. RecyclerView sürümlerinizi tedarik edebilir misiniz?
zayn

26

Sadece kendinden recyclerView.setNestedScrollingEnabled(false);önce eklemek setAdapterbenim için çalıştı. Hiçbir app:layout_behavior="@string/appbar_scrolling_view_behavior"yere eklemedim ve herhangi bir özel düzen yöneticisi ayarlamadım

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                android:text="Some Text..."
                android:padding="15dp" />

        </LinearLayout>

        <LinearLayout
            android:orientation="vertical"
            android:padding="15dp"
            android:layout_marginTop="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Quick Links"
                android:textColor="@color/black"
                android:textStyle="bold"
                android:textAllCaps="true"
                android:paddingLeft="20dp"
                android:drawableLeft="@drawable/ic_trending_up_black_24dp"
                android:drawablePadding="10dp"
                android:layout_marginBottom="10dp"
                android:textSize="16sp"/>

            <View
                android:layout_width="fill_parent"
                android:layout_height="1dp"
                android:background="#efefef"/>

            <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/recyclerview"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>

    </LinearLayout>

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

10
Ancak artık görünümleri geri dönüştürmüyor?
Mark Buikema

Hayır, geri dönüşüm yapacak, değil mi?
Vignesh Sundar

6
hayır değil, ben 200 öğeleri ile çok karmaşık bir düzen ile denedim nestedscrollview sadece çocuklarının boyutuna genişler, bu yüzden genişleyecek, bu nedenle hiçbir geri dönüşüm olmayacak @MarkBuikema daha iyi bir çözüm bulmayı başardınız mı?
RJFares

20

Benim için çalışan bu

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.v4.widget.NestedScrollView>

4
İkinci uygulamayı kaldırabilirsiniz : layout_behavior = "@ string / appbar_scrolling_view_behavior" Davranış yalnızca CoordinatorLayout doğrudan alt öğeleri için geçerlidir.
Pepster

2
Ayrıca, kök düzeniniz olarak Koordinatör düzenine sahip olmanız gerektiğini belirtmek önemlidir . Her zaman doğru değildir.
Gaket

10

Kontrol edebileceğiniz basit ve test kodu var

<android.support.v4.widget.NestedScrollView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fillViewport="true"
     app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <android.support.v7.widget.RecyclerView
           android:layout_width="match_parent"
           android:layout_height="match_parent"/>
   </android.support.v4.widget.NestedScrollView>

9

Çünkü androidxdenir androidx.core.widget.NestedScrollView- ve aynı zamanda özellikleri ile tereyağı kaydırır isScrollContainerve measureAllChildrenetkinleştirilir:

<!-- Scrolling Content -->
<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:isScrollContainer="true"
    android:measureAllChildren="true"

    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fastScrollEnabled="true"
        android:scrollbarStyle="insideInset"
        android:scrollbars="vertical"
        android:splitMotionEvents="false"
        android:verticalScrollbarPosition="right"/>

</androidx.core.widget.NestedScrollView>

7

Bu kütüphaneyi kullanmaya çalışın - https://github.com/serso/android-linear-layout-manager .

Kütüphanenin LayoutManager'ı RecyclerView'in içeriğini tamamlamasını sağlar. Bu durumda RecyclerView "iç görünümler kadar büyük" olacaktır, bu nedenle kaydırma çubukları olmayacaktır ve kullanıcı NestedScrollView'un kaydırma yeteneklerini kullanacaktır. Bu nedenle, "kaydırılabilir içinde kaydırılabilir" gibi belirsiz olmayacaktır.


1
Bu kütüphaneden LinearLayoutManager sınıfı: github.com/serso/android-linear-layout-manager/blob/master/lib/…
Ninja Kodlama

6

Kaydırma sorunlarını önlemek için kullandığım kod:

mRecyclerView = (RecyclerView) view.findViewById(android.R.id.list);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.getLayoutManager().setAutoMeasureEnabled(true);
mRecyclerView.setNestedScrollingEnabled(false);
mRecyclerView.setHasFixedSize(false);

6

Bir NestedScrollView içinde RecyclerView kullandım ve benim için çalıştı. Aklımda tutmam gereken tek şey, bir NestedScrollView öğesinin yalnızca bir çocuk görünümü almasıydı. Bu yüzden benim durumumda, RecyclerView ile birlikte ihtiyacım olan bir dizi başka görünümü barındıran LienearLayout görünüm grubunu kullandım.

Benim RecyclerView NestedScrollView içine koyarak bir sorun yaşıyorum. RecyclerView'imin içeriğinin kaydırılmasının gevşediğini fark ettim.

Daha sonra RecyclerView benim kaydırma olayı alıyordu ve bu nedenle NestedScrollView kaydırma davranışı ile çakıştığını fark ettim.

Bu sorunu çözmek için RecyclerView'imin kaydırma işlevini bu yöntemle devre dışı bırakmak zorunda kaldım movieListNewRecyclerView.setNestedScrollingEnabled(false);

Gerçekte yaptığımın kısa bir videosu için Instagram'a göz atabilirsiniz. Bu benim instagram sapım ofelix03

Ne yaptığımı görmek için bu resme tıklayın


5

NestedScrollView içinde Viewpager ve RecyclerView var. Aşağıdaki satırları ekledikten sonra

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);

Yavaş kaydırma ve kaydırma gecikmesi sorununu çözdüm.


3
Bunu mu demek istediniz recyclerView.setHasFixedSize(true);?
Keno Clayton

3

Yuvalanmış kaydırma görünümünde bir geri dönüşüm görünümü kullanamazsınız. Başka kaydırılabilir görünümler içermesi amaçlanmamıştır, ancak bunun nedeni, iç içe kaydırma görünümüne ihtiyacınız olan bir kaydırma düzeninin kendisinin alt öğesidir. Aynı sorunu yaşadım ama sonunda textview'imi recyclerview içinde bir headerview olarak taşıdım, recyclerview'i koordinatör düzeninin doğrudan çocuğu yaptı ve iç içe kaydırma görünümünü sildim. Sonra bütün problemlerim gitti.


8
Yana RecyclerViewuygular NestedScrollingChild, RecyclerViewüzeri kaydırılmalıdır gerekir NestedScrollView.
Benjamin

Sadece İngilizce hatalara dayanarak stackoverflow.com/review/suggested-edits/9907622 reddetmek için oy verdim , ancak orada değer içeriği olabilir - konunun bilgisiyle geçen herkes bir göz atmalı ve temizleyebilir. Orada yararlı bir şey yoksa, modumu silmek için bu yorumumu işaretleyin.
Mark Amery

3

RecyclerView-23.2.1Veya daha sonra kullanıyorsanız . Aşağıdaki çözüm iyi çalışır:

Düzeninize şu şekilde RecyclerView ekleyin:

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

Ve java dosyanızda:

RecyclerView mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager=new LinearLayoutManager(getContext());
layoutManager.setAutoMeasureEnabled(true);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setAdapter(new YourListAdapter(getContext()));

İşte layoutManager.setAutoMeasureEnabled(true);hile yapacağız.

Check out Bu sorunu ve bu geliştirici blogu Daha fazla bilgi için.


"MRecyclerView.setHasFixedSize (true);" komutunu kullanırken dikkatli olun. rağmen. Bunu yalnızca çalışma zamanında geri dönüşümcü görünümüne öğe eklemez veya kaldırmazsanız kullanabilirsiniz.
Gaket

2

Geri dönüşüm görünümünün geri dönüşüm özelliğini korumak ve tüm verilerinizi yüklemek için geri dönüşüm görünümünden kaçınmak için bir çözüm, geri dönüşüm görünümünün kendisinde bir sabit yükseklik ayarlamaktır. Bunu yaparak, geri dönüşüm görünümü yalnızca yüksekliğinin kullanıcıya gösterebileceği kadar yük ile sınırlıdır, böylece aşağı / yukarı kaydırdığınızda elemanını geri dönüştürür.


2

Çok iyi cevaplar var. Anahtar, ayarlamanız nestedScrollingEnabledgerektiğidir false. Yukarıda belirtildiği gibi java kodunda yapabilirsiniz:

mRecyclerView.setNestedScrollingEnabled(false);

Ancak, aynı özelliği xml kodunda ( android:nestedScrollingEnabled="false") ayarlama fırsatınız da vardır :

 <android.support.v7.widget.RecyclerView
 android:id="@+id/recyclerview"
 android:nestedScrollingEnabled="false"
 android:layout_width="match_parent"
 android:layout_height="match_parent" />

2

Eğer kullanıyorsanız RecyclerView ScrollListener içeride NestedScrollView hem kullanılırsa, addOnScrollListener dinleyici düzgün çalışmıyor.

Bu kodu kullanın.

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState); 
              ......
        }
    });

Bu kod çalışma ince RecyclerView ScrollListener içeride NestedScrollView .

Teşekkürler


1

Araç çubuğu kaydırma ile CoordinatorLayout'u uygulamak zorunda kaldım ve bu beni bütün gün karıştırıyordu. Hiç NestedScrollView kaldırarak çalıştım. Bu yüzden sadece kökünde RelativeLayout kullanıyorum.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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.support.v7.widget.RecyclerView
            android:id="@+id/rv_nearby"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</RelativeLayout>

1

NestedScrollView içinde recyclerView kullanmayın. basamaklı sorunlara neden olabilir! Birden çok görünüm türünü işlemek için RecyclerView'de ItemViewTypes kullanmanızı öneririm. sadece match_parent genişlik ve yükseklikte bir RecyclerView ekleyin. sonra recyclerViewAdapter getItemViewType geçersiz kılma ve hangi düzeni şişirilecek ele almak için konum kullanın. bundan sonra onBindViewHolder yöntemini kullanarak görünüm tutucunuzu işleyebilirsiniz.


1
nestedScrollView.setNestedScrollingEnabled(true);

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            //...
        }
    });


<androidx.core.widget.NestedScrollView
    android:id="@+id/nested"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:layout_below="@id/appBarLayout_orders"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <androidx.constraintlayout.widget.ConstraintLayout ...

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>

0

Bu harika uzantıyı kullandım (kotlin ile yazılmış ancak Java'da da kullanılabilir)

https://github.com/Widgetlabs/expedition-nestedscrollview

Temelde NestedRecyclerViewiçine almak olsun herhangi bir paket sağlar projenizdeki araçları, sonra sadece oluşturmak geri dönüşüm görünümü gibi

 <com.your_package.utils.NestedRecyclerView
      android:id="@+id/rv_test"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

Marc Knaup'un bu harika makalesine göz atın

https://medium.com/widgetlabs-engineering/scrollable-nestedscrollviews-inside-recyclerview-ca65050d828a


0

İç içe kaydırma görünümünde tüm geri dönüşüm görünümü altını bir kerede yüklememek için çözüm .

Benfits:

  1. iç içe kaydırma görünümünü kullanırken tüm alt öğeyi bir kez yüklemeyin.
  2. daha iyi performans için recycleView.setHasFixedSize (true) kullanabilirsiniz
  3. Web hizmetlerinin tüm verileri bir kerede göndermesini önleyin, sayfalandırma beklendiği gibi çalışır
  4. çok sayıda veri seti için iyi.
  5. düşük bellek aygıtları için iyi
  6. iç içe kaydırma özelliğini kullanmaya devam edebilir
  7. recyle görünüm öğe karmaşık ve çok kaynak gerektirdiğinde çok yararlı.

Düzeltme:

geri dönüşüm görünümü için match_parent veya wrap_content yerine xml'nizde düzeltme yüksekliğini kullanın .


-5

NestedScrollView ile RecyclerView

    <android.support.v7.widget.RecyclerView
    android:id="@+id/rv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
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.