Bagaimana cara menggunakan RecyclerView di dalam NestedScrollView?

210

Bagaimana cara menggunakannya RecyclerViewdi dalam NestedScrollView? RecyclerViewkonten tidak terlihat setelah mengatur adaptor.

Kode tata letak UPDATE diperbarui.

<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>
Mekid
sumber
@Mecid Tidak ada alasan untuk menggunakan RecyclerView di dalam ScrollView (atau NestedScrollView).
Gabriele Mariotti
2
@Mecid Anda tidak boleh meletakkan tampilan yang dapat digulir di dalam tampilan yang dapat digulir. Ini adalah aturan umum di Android.
Gabriele Mariotti
6
@GabrieleMariotti saya tahu aturan ini, tetapi NestedScrollView dikembangkan untuk memperbaiki masalah ini.
Mecid
1
Itu tidak benar. NestedScrollView sama seperti ScrollView, tetapi mendukung akting sebagai induk dan anak pengguliran bersarang. Dalam kasus Anda, Anda harus mendefinisikan perilaku pengguliran Anda sendiri.
Gabriele Mariotti

Jawaban:

216

Ganti recyclerView Anda dengan,

<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" />

sini,

app:layout_behavior="@string/appbar_scrolling_view_behavior"

akan mengatur sisanya.

Satu hal lagi, tidak perlu meletakkan recyclerView Anda di dalam NestedScrollView

Rahul Upadhyay
sumber
33
Saya tidak mengerti mengapa solusi ini tidak mendapatkan suara terbanyak. Itu tidak tercapai dengan NestedScrollViewtetapi hanya dengan app:layout_behavior="@string/appbar_scrolling_view_behavior". Ini kuncinya!
hata
3
@RahulUpadhyay ini bekerja untuk saya, tapi saya pikir baris terakhir Anda salah, RecyclerView tidak muncul sama sekali jika itu di dalam NestedScrollView. Namun, Anda seorang superstar: D
Leon
3
Berhasil! cukup perbarui pustaka recyclerview kompilasi 'com.android.support:recyclerview-v7:+'
Fabio Guerra
28
Solusi ini dimaksudkan untuk digunakan dengan CoordinatorLayout,, AppBarLayoutdan pengaturan yang sesuai layout_scrollFlagspada tampilan anak yang harus digulirkan dengan RecyclerView. Tidak yakin mengapa ini dihilangkan dari jawaban. Kalau tidak, ini adalah solusi yang bagus dan sederhana.
Sanvywell
9
Saya pikir sangat penting untuk memahami bahwa DAUR ULANG RecyclerView TIDAK AKAN BEKERJA di sini. Akibatnya, jika Anda memiliki daftar item yang panjang, item itu akan muncul dengan pembekuan UI yang nyata.
Gaket
121

PEMBARUAN 1

Sejak Android Support Library 23.2.0 ada metode tambahan setAutoMeasureEnabled(true)untuk LayoutManagers. Itu membuat RecyclerView untuk membungkus konten itu dan bekerja seperti pesona.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

Jadi tambahkan saja seperti ini:

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


PEMBARUAN 2

Karena 27.1.0 setAutoMeasureEnabledsudah tidak digunakan lagi, maka Anda harus menyediakan implementasi kustom LayoutManager dengan metode yang digantiisAutoMeasureEnabled()

Tetapi setelah banyak kasus penggunaan, RecyclerView saya sangat menyarankan untuk tidak menggunakannya mode pembungkus , karena ini bukan yang dimaksudkan untuk itu. Cobalah untuk memperbaiki seluruh tata letak Anda menggunakan RecyclerView tunggal normal dengan tipe beberapa item. Atau gunakan pendekatan dengan LinearLayout yang saya jelaskan di bawah ini sebagai pilihan terakhir


Jawaban lama (tidak disarankan)

Anda bisa menggunakannya RecyclerViewdi dalam NestedScrollView. Pertama-tama Anda harus menerapkan kebiasaan Anda sendiri LinearLayoutManager, itu membuat Anda RecyclerViewuntuk membungkus isinya. Sebagai contoh:

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);
    }
}

Setelah itu gunakan ini LayoutManageruntuk AndaRecyclerView

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

Tetapi Anda juga harus memanggil kedua metode itu:

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

Di sini setNestedScrollingEnabled(false)nonaktifkan pengguliran RecyclerView, sehingga tidak mencegat acara pengguliran NestedScrollView. DansetHasFixedSize(false) menentukan bahwa perubahan konten adaptor dapat mengubah ukuranRecyclerView

Catatan penting: Solusi ini sedikit bermasalah dalam beberapa kasus dan memiliki masalah dengan kinerja, jadi jika Anda memiliki banyak item dalam Anda, RecyclerViewsaya akan merekomendasikan untuk menggunakan LinearLayoutimplementasi berbasis tampilan daftar, buat analog Adaptor untuk itu dan buatlah berperilaku seperti ListViewatauRecyclerView

smbd uknow
sumber
19
Peringatan! Jangan gunakan ini jika Anda memiliki banyak item di RecyclerView.
Brais Gabin
1
@BraisGabin, Anda benar: setHasFixedSize (false) menyebabkan banyak penyegaran dari RecyclerView, jadi jika ia memiliki banyak item, ini akan bekerja sangat lambat. Dalam kasus tersebut saya menggunakan LinearLayout dengan semacam "adaptor" khusus untuk membuatnya berperilaku seperti ListView atau RecyclerView
smbd uknow
1
Terima kasih banyak! Menyelamatkan saya berjam-jam. By the way, dekorasi item terakhir tidak ditampilkan dengan manajer tata letak ini (dan hanya dengan yang ini), mungkin bug?
Jjang
2
setAutoMeasureEnabled sudah tidak digunakan lagi pada level API 27.1.0 developer.android.com/reference/android/support/v7/widget/…
Dika
2
menimpa boolean isAutoMeasureEnabled () sebagai gantinya. Mengembalikan apakah pengukuran pass tata letak harus menggunakan mekanisme AutoMeasure dari RecyclerView atau jika harus dilakukan oleh implementasi onMeasure LayoutManager (Recycler, State, int, int). Metode ini mengembalikan false secara default (sebenarnya mengembalikan nilai yang diteruskan ke setAutoMeasureEnabled yang sudah usang (boolean)) dan harus diganti untuk mengembalikan true jika LayoutManager ingin diukur secara otomatis oleh RecyclerView. Jika metode ini diganti untuk mengembalikan true, onMeasure (Recycler, State, int, int) tidak boleh diganti.
Peterstev Uremgba
100

1) Anda harus menggunakan perpustakaan dukungan 23.2.0 (atau) di atas

2) dan RecyclerViewtinggi akanwrap_content .

3) recyclerView.setNestedScrollingEnabled(false)

Tetapi dengan melakukan ini, pola pendaur ulang tidak berfungsi . (Yaitu semua tampilan akan dimuat sekaligus karena wrap_contentmembutuhkan ketinggian lengkap RecyclerViewsehingga akan menarik semua Views at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to useviewType anak and add all other views that need to scroll toRecyclerView rather than usingRecyclerView inScrollview`. Dampak kinerja akan sangat tinggi.

Sederhananya "itu hanya bertindak seperti LinearLayoutsemua pandangan anak"

Ashok Varma
sumber
6
Terima kasih @Ashok. Pengaturan recyclerView.setNestedScrollingEnabled(false)membantu saya untuk memiliki gulungan yang lancar.
Shubhral
3
Ini harus menjadi jawaban yang diterima! karena itu dengan baik menunjukkan bahwa Tidak ada tampilan yang akan didaur ulang dan semua tampilan akan diambil sekaligus.
M'hamed
3
@AshokVarma, masalah yang sama yang saya hadapi sekarang. tetapi gulir bekerja dengan baik di dalam recyclerView tetapi saya tidak bisa menerapkan gulir tanpa akhir untuk recyclerview karena semua tampilan recyclerview menarik sekaligus sehingga mengarah untuk terus memanggil layanan web. jadi bagaimana saya bisa menangani ini?
Anantha Babu
@AnanthaBabu alih-alih menggunakan recyclerview dalam scrollview. mengonversi semua item di scrollview ke item dalam tampilan pendaur ulang. Anda dapat menggunakan jenis tampilan daur ulang dan melukis berbagai jenis tata letak. Ada beberapa pustaka yang baik untuk menangani ini juga (Gunakan pustaka jika Anda memiliki struktur tampilan yang sangat rumit dan jika Anda ingin komponen yang dapat digunakan kembali).
Ashok Varma
1
@AshokVarma apakah ada solusi untuk masalah perilaku pendaur ulang? Saya tidak ingin recyclerview menggambar semua anak sekaligus.
andro-girl
36

Anda dapat menggunakan android:fillViewport="true"untuk NestedScrollViewmengukur RecyclerView. The RecyclerViewakan memenuhi tinggi yang tersisa. jadi jika Anda ingin untuk menggulir NestScrollView, Anda dapat mengatur RecyclerView's minHeight.

zayn
sumber
14
jika Anda memiliki tinjauan ulang 200 item dan Anda melakukan ini, nestedscrollview akan diperluas untuk mengisi seluruh 200 item!
RJFares
1
@RJFares Itu tidak pernah terjadi. Saya mencoba demo dan menggunakan LayoutInspector untuk memeriksa tata letak, itu hanya berfungsi dengan baik. Bisakah Anda memberikan versi recyclerView Anda?
zayn
26

Cukup menambahkan recyclerView.setNestedScrollingEnabled(false);sebelum setAdapteritu sendiri bekerja untuk saya. Saya tidak menambahkan di app:layout_behavior="@string/appbar_scrolling_view_behavior"mana pun & tidak mengatur manajer tata letak khusus

<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>
Vignesh Sundar
sumber
10
Tapi sekarang tidak mendaur ulang tampilan lagi?
Mark Buikema
Tidak, itu akan didaur ulang, bukan?
Vignesh Sundar
6
tidak bukan, saya mencoba dengan tata letak yang sangat kompleks dengan 200 item nestedscrollview hanya memperluas ke ukuran anak-anaknya sehingga akan berkembang, oleh karena itu tidak akan terjadi daur ulang @MarkBuikema apakah Anda berhasil menemukan solusi yang lebih baik?
RJFares
20

Inilah yang bekerja untuk saya

<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>
Ness Tyagi
sumber
4
Anda dapat menghapus aplikasi kedua : layout_behavior = "@ string / appbar_scrolling_view_behavior" Karena perilaku hanya berfungsi untuk anak langsung CoordinatorLayout.
Pepster
2
Selain itu, penting untuk menyebutkan bahwa Anda harus memiliki tata letak Koordinator sebagai tata letak root Anda. Itu tidak selalu benar.
Gaket
10

Ada kode pengujian yang sederhana dan dapat Anda periksa

<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>
Hakim Khan
sumber
9

Untuk androidxitu disebut androidx.core.widget.NestedScrollView- dan itu juga menggulung sama mentega dengan properti isScrollContainerdan measureAllChildrendiaktifkan:

<!-- 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>
Martin Zeitler
sumber
7

Coba gunakan perpustakaan ini - https://github.com/serso/android-linear-layout-manager .

LayoutManager dari perpustakaan membuat RecyclerView membungkus isinya. Dalam hal ini, RecyclerView akan "sebesar pandangan bagian dalam", jadi ia tidak akan memiliki scrollbar dan pengguna akan menggunakan kemampuan bergulir NestedScrollView. Oleh karena itu, tidak akan ambigu seperti "scrollable inside scrollable".

alcsan
sumber
1
Ini adalah kelas LinearLayoutManager dari perpustakaan ini: github.com/serso/android-linear-layout-manager/blob/master/lib/…
Ninja Coding
6

Berikut adalah kode yang saya gunakan untuk menghindari masalah gulir:

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

Saya menggunakan RecyclerView di dalam NestedScrollView dan itu berhasil untuk saya. Satu-satunya hal yang harus saya ingat adalah bahwa NestedScrollView hanya membutuhkan satu tampilan anak. Jadi dalam kasus saya, saya menggunakan viewgroup LienearLayout yang menampung RecyclerView saya ditambah sejumlah pandangan lain yang saya butuhkan.

Saya mengalami satu masalah dengan meletakkan RecyclerView saya di dalam NestedScrollView. Saya menyadari bahwa menggulirkan konten RecyclerView saya menjadi malas.

Saya kemudian menyadari bahwa RecyclerView saya menerima acara gulir dan oleh karena itu bertentangan dengan perilaku gulir dari NestedScrollView.

Jadi untuk mengatasi masalah itu, saya harus menonaktifkan fungsi gulir dari RecyclerView saya dengan metode ini movieListNewRecyclerView.setNestedScrollingEnabled(false);

Anda dapat checkout Instagram saya untuk video singkat tentang apa yang sebenarnya saya lakukan. Ini adalah pegangan instagram ofelix03 saya

Klik gambar ini untuk melihat apa yang saya lakukan

Felix Otoo
sumber
5

Saya memiliki Viewpager dan RecyclerView di dalam NestedScrollView. Setelah menambahkan garis di bawah ini

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

Saya memecahkan masalah gulir lambat dan gulir lag.

Isham
sumber
3
Bukankah maksud Anda recyclerView.setHasFixedSize(true);?
Keno Clayton
3

Anda tidak dapat menggunakan tampilan pendaur ulang dalam tampilan gulir bersarang. Ini tidak dimaksudkan untuk berisi lebih lanjut tampilan yang dapat digulir tetapi itu karena itu adalah anak dari tata letak pengguliran itu sendiri sehingga Anda memerlukan tampilan pengguliran bersarang. Saya memiliki masalah yang sama tetapi pada akhirnya saya memindahkan tampilan teks saya menjadi tampilan header di dalam recyclerview, menjadikan recyclerview sebagai anak langsung dari tata letak koordinator dan menghapus tampilan gulir bersarang. Lalu semua masalah saya hilang.

Barry Irvine
sumber
8
Sejak RecyclerViewimplementasi NestedScrollingChild, RecyclerViewharus dapat digulir melalui NestedScrollView.
Benjamin
Saya baru saja memilih untuk menolak stackoverflow.com/review/suggested-edits/9907622 murni berdasarkan kesalahan bahasa Inggris, tetapi mungkin ada konten yang bernilai di sana - siapa pun yang lewat dengan pengetahuan tentang materi pelajaran harus melihat dan melihat apakah mereka dapat membersihkannya. Jika tidak ada yang berguna di sana, tandai komentar ini untuk dihapus oleh para mod.
Mark Amery
3

Jika Anda menggunakan RecyclerView-23.2.1 atau lebih baru. Solusi berikut akan bekerja dengan baik:

Dalam tata letak Anda, tambahkan RecyclerView seperti ini:

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

Dan di file java Anda:

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()));

Sini layoutManager.setAutoMeasureEnabled(true); akan melakukan trik.

Lihat masalah ini dan blog pengembang ini untuk informasi lebih lanjut.

uniruddh
sumber
Hati-hati menggunakan "mRecyclerView.setHasFixedSize (true);" meskipun. Anda dapat menggunakannya hanya jika Anda tidak menambah atau menghapus item dari tampilan pendaur ulang saat runtime.
Gaket
2

Salah satu solusi untuk menjaga fitur daur ulang dari recyclerview dan menghindari recyclerview untuk memuat semua data Anda adalah mengatur ketinggian tetap di recyclerview itu sendiri. Dengan melakukan ini, recyclerview terbatas hanya untuk memuat sebanyak tingginya dapat menunjukkan pengguna sehingga daur ulang elemennya jika Anda gulir ke bawah / atas.

Christian Callelero
sumber
2

Ada banyak jawaban bagus. Kuncinya adalah bahwa Anda harus mengatur nestedScrollingEnableduntuk false. Seperti yang disebutkan di atas, Anda dapat melakukannya dalam kode java:

mRecyclerView.setNestedScrollingEnabled(false);

Tetapi Anda juga memiliki kesempatan untuk mengatur properti yang sama dalam kode xml ( android:nestedScrollingEnabled="false"):

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

Jika Anda menggunakan RecyclerView ScrollListener di dalam NestedScrollView , addOnScrollListener listener tidak berfungsi dengan baik jika Anda menggunakan keduanya.

Gunakan kode ini.

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

kode ini berfungsi dengan baik RecyclerView ScrollListener di dalam NestedScrollView .

Terima kasih

Rahul
sumber
1

Saya harus mengimplementasikan CoordinatorLayout dengan menggulir bilah alat dan hanya butuh waktu sepanjang hari untuk mengacaukannya. Saya sudah membuatnya bekerja dengan menghapus NestedScrollView sama sekali. Jadi saya hanya menggunakan RelativeLayout di root.

<?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>
Bogdan Ustyak
sumber
1

jangan gunakan recyclerView di dalam NestedScrollView. itu dapat menyebabkan masalah kaskade! Saya sarankan menggunakan ItemViewTypes di RecyclerView untuk menangani berbagai jenis tampilan. cukup tambahkan RecyclerView dengan lebar dan tinggi match_parent. kemudian di recyclerViewAdapter Anda menimpa getItemViewType dan gunakan posisi untuk menangani tata letak apa yang akan digelembungkan. setelah itu Anda dapat menangani view view Anda dengan menggunakan metode onBindViewHolder.

Hossein Karami
sumber
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"/>
Braian Coronel
sumber
0

Saya telah menggunakan ekstensi yang luar biasa ini (ditulis dalam kotlin tetapi dapat juga digunakan di Jawa)

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

Pada dasarnya Anda mendapatkan bagian NestedRecyclerViewdalam paket apa saja katakanlah utils dalam proyek Anda, kemudian buat saja recyclerview Anda

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

Lihat artikel yang luar biasa ini dari Marc Knaup

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

Gastón Saillén
sumber
0

Solusi untuk tidak memuat semua tampilan anak daur ulang sekaligus di dalam tampilan gulir bersarang .

Manfaat:

  1. tidak memuat semua anak satu kali, saat menggunakan tampilan gulir bersarang.
  2. Anda dapat menggunakan recycleView.setHasFixedSize (true) untuk kinerja yang lebih baik
  3. mencegah layanan web untuk mengirim semua data sekaligus, pagination berfungsi seperti yang diharapkan
  4. bagus untuk jumlah set data yang lebih besar.
  5. bagus untuk perangkat dengan memori rendah
  6. dapat terus menggunakan pengguliran bersarang
  7. sangat membantu ketika recyle Anda melihat item yang kompleks dan membutuhkan banyak sumber daya.

Perbaiki:

di xml Anda alih-alih menggunakan match_parent atau wrap_content untuk recycleview gunakan fix fix .

Abhishek Garg
sumber
0

Untuk kasus saya, anak dari NestedScrollview adalah ConstraintLayout. Ini tidak berfungsi seperti yang diharapkan saya menggantinya ke LinearLayout. Mungkin itu membantu seseorang.

<androidx.core.widget.NestedScrollView 
  android:id="@+id/nestedScrollView" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent">

  <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:descendantFocusability="blocksDescendants">

    <androidx.recyclerview.widget.RecyclerView
      android:id="@+id/recyclerView"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:nestedScrollingEnabled="false"
      app:layout_constraintBottom_toTopOf="@+id/divider"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@+id/tinTitle"/>

  </LinearLayout>
</androidx.core.widget.NestedScrollView>
nAkhmedov
sumber
-5

RecyclerView dengan NestedScrollView

    <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" />
devangi chhatbar
sumber