Saya mencoba menerapkan tata letak yang berisi RecyclerView dan ScrollView pada tata letak yang sama.
Template tata letak:
<RelativeLayout>
<ScrollView android:id="@+id/myScrollView">
<unrelated data>...</unrealated data>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/my_recycler_view"
/>
</ScrollView>
</RelativeLayout>
Masalah: saya dapat menggulir hingga elemen terakhir dari ScrollView
Hal yang saya coba:
- tampilan kartu di dalam
ScrollView
(sekarangScrollView
berisiRecyclerView
) - dapat melihat kartu hinggaRecyclerView
- pemikiran awal adalah untuk mengimplementasikan ini
viewGroup
menggunakanRecyclerView
bukan diScrollView
mana salah satu jenis pandangan itu adalahCardView
tetapi saya mendapat hasil yang sama persis denganScrollView
NestedScrollView
, karena menangani banyak masalah gulirNestedScrollView
bukan aScrollView
. Itulah tepatnya untuk apa.Jawaban:
gunakan
NestedScrollView
sebagai gantiScrollView
Silakan buka dokumen referensi NestedScrollView untuk informasi lebih lanjut.
dan tambahkan
recyclerView.setNestedScrollingEnabled(false);
keRecyclerView
sumber
android:layout_height="wrap_content"
untuk tata letak yang meningkat untuk ViewHolderNestedScrollView
tertinggal bagi saya, tidak sepertiScrollView
. Mencari solusi tanpa menggunakanNestedScrollView
Saya tahu saya terlambat bermain, tetapi masalah masih ada bahkan setelah google telah memperbaiki
android.support.v7.widget.RecyclerView
Masalah yang saya dapatkan sekarang adalah
RecyclerView
denganlayout_height=wrap_content
tidak mempertimbangkan semua masalah item di dalamScrollView
yang hanya terjadi pada versi Marshmallow dan Nougat + (API 23, 24, 25).(UPDATE: Mengganti
ScrollView
denganandroid.support.v4.widget.NestedScrollView
karya pada semua versi. Saya entah bagaimana melewatkan pengujian solusi yang diterima . Menambahkan ini dalam proyek github saya sebagai demo.)Setelah mencoba berbagai hal, saya telah menemukan solusi yang memperbaiki masalah ini.
Berikut ini adalah singkatnya struktur tata letak saya:
Solusinya adalah bungkus
RecyclerView
denganRelativeLayout
. Jangan tanya saya bagaimana saya menemukan solusi ini !!!¯\_(ツ)_/¯
Contoh lengkap tersedia di proyek GitHub - https://github.com/amardeshbd/android-recycler-view-wrap-content
Berikut adalah demo layar menunjukkan perbaikan dalam tindakan:
sumber
Meskipun rekomendasi itu
Merupakan saran yang bagus, namun jika Anda menetapkan ketinggian tetap pada tampilan pendaur ulang, itu akan berfungsi dengan baik.
Jika Anda tahu ketinggian tata letak item adaptor, Anda bisa menghitung ketinggian RecyclerView.
sumber
adapterItemSize
variabelnya?Dalam hal mengatur ketinggian tetap untuk RecyclerView tidak berfungsi untuk seseorang (seperti saya), berikut adalah apa yang saya tambahkan ke solusi ketinggian tetap:
sumber
Baru Perpustakaan Dukungan Android 23,2 memecahkan bahwa masalah, Anda sekarang dapat mengatur wrap_content sebagai tinggi Anda
RecyclerView
dan bekerja dengan benar.Perpustakaan Dukungan Android 23.2
sumber
RecyclerViews boleh dimasukkan ke ScrollViews selama mereka tidak menggulir diri. Dalam hal ini, masuk akal untuk membuatnya tinggi tetap.
Solusi yang tepat adalah menggunakan
wrap_content
pada ketinggian RecyclerView dan kemudian mengimplementasikan LinearLayoutManager kustom yang dapat menangani pembungkus dengan benar.Salin LinearLayoutManager ini ke proyek Anda: https://github.com/serso/android-linear-layout-manager/blob/master/lib/src/main/java/org/solovyev/android/views/llm/LinearLayoutManager.java
Kemudian bungkus RecyclerView:
Dan atur seperti ini:
Sunting: Ini dapat menyebabkan komplikasi dengan menggulir karena RecyclerView dapat mencuri acara sentuh ScrollView. Solusi saya adalah hanya membuang RecyclerView di semua dan pergi dengan LinearLayout, secara terprogram mengembang subviews, dan menambahkannya ke tata letak.
sumber
Sebab
ScrollView
, Anda bisa menggunakanfillViewport=true
dan membuatlayout_height="match_parent"
seperti di bawah ini dan meletakkan tampilan pendaur ulang di dalamnya:Tidak diperlukan penyesuaian ketinggian lebih lanjut melalui kode.
sumber
Menghitung
RecyclerView
tinggi secara manual tidak baik, lebih baik menggunakan kebiasaanLayoutManager
.Alasan untuk masalah di atas adalah pandangan yang memiliki gulir itu (
ListView
,GridView
,RecyclerView
) gagal untuk menghitung tinggi itu ketika add sebagai anak dalam pandangan lain memiliki gulir. Jadi menggantionMeasure
metodenya akan menyelesaikan masalah.Silakan ganti manajer tata letak default dengan yang di bawah ini:
sumber
Coba ini. Jawabannya sangat terlambat. Tapi pasti membantu siapa pun di masa depan.
Setel Scrollview Anda ke NestedScrollView
Di Recyclerview Anda
sumber
UPDATE: jawaban ini sudah usang sekarang karena ada widget seperti NestedScrollView dan RecyclerView yang mendukung pengguliran bersarang.
Anda tidak boleh meletakkan tampilan yang dapat digulir di dalam tampilan yang dapat digulir lainnya!
saya sarankan Anda membuat tampilan pendaur ulang tata letak utama Anda dan menempatkan pandangan Anda sebagai item tampilan pendaur ulang.
lihat contoh ini yang menunjukkan cara menggunakan beberapa tampilan di dalam adaptor tampilan pendaur ulang. tautan ke contoh
sumber
Jika Anda memasukkan ke
RecyclerView
dalamNestedScrollView
dan mengaktifkanrecyclerView.setNestedScrollingEnabled(false);
, menggulir akan bekerja dengan baik .Namun, ada masalah
Misalnya,
RecyclerView
(dalamNestedScrollView
atauScrollView
) Anda memiliki 100 item.Saat
Activity
diluncurkan, 100 item akan dibuat (onCreateViewHolder
danonBindViewHolder
100 item akan dipanggil bersamaan).Contoh, untuk setiap item, Anda akan memuat gambar besar dari API => aktivitas yang dibuat -> 100 gambar akan dimuat.
Itu membuat Aktivitas lambat dan lambat.
Solusi yang memungkinkan :
- Berpikir untuk menggunakan
RecyclerView
dengan beberapa tipe.Namun, jika dalam kasus Anda, hanya ada beberapa item dalam
RecyclerView
dan mendaur ulang atau tidak mendaur ulang tidak banyak mempengaruhi kinerja, Anda dapat menggunakanRecyclerView
di dalamScrollView
untuk sederhanasumber
RecyclerView
daur ulang setelah dimasukkan keScrollView
. Jika Anda ingin mendaur ulang, pikirkan pendekatan lain (seperti menggunakan RecyclerView dengan beberapa tipe)Anda dapat menggunakan cara ini:
Tambahkan baris ini ke tampilan xml recyclerView Anda:
coba saja, recyclerview akan digulir dengan lancar dengan ketinggian yang fleksibel
Semoga ini bisa membantu.
sumber
Tampaknya
NestedScrollView
memang memecahkan masalah. Saya sudah diuji menggunakan tata letak ini:Dan itu bekerja tanpa masalah
sumber
Saya menggunakan CustomLayoutManager untuk menonaktifkan RecyclerView Scrolling. Juga jangan gunakan Recycler View sebagai WrapContent, gunakan sebagai 0dp, Berat = 1
Gunakan CustomLayoutManager di RecyclerView:
XML UI:
sumber
Saya mengalami masalah yang sama. Itu yang saya coba dan berhasil. Saya membagikan kode xml dan java saya. Semoga ini bisa membantu seseorang.
Inilah xml
Berikut ini adalah kode java terkait. Itu bekerja seperti pesona.
sumber
NestedScrollView
alih-alih tampilan gulirIni caranya:
sumber
Sebenarnya tujuan utama dari
RecyclerView
kompensasi adalah untukListView
danScrollView
. Alih-alih melakukan apa yang sebenarnya Anda lakukan: MemilikiRecyclerView
dalamScrollView
, saya sarankan hanya memilikiRecyclerView
yang dapat menangani banyak jenis anak.sumber
Pertama, Anda harus menggunakan dan
NestedScrollView
bukannyaScrollView
meletakkan diRecyclerView
dalamNestedScrollView
.Gunakan kelas tata letak khusus untuk mengukur tinggi dan lebar layar:
Dan terapkan kode di bawah ini dalam aktivitas / fragmen
RecyclerView
:sumber
Jika RecyclerView hanya menampilkan satu baris di dalam ScrollView. Anda hanya perlu mengatur ketinggian baris Anda
android:layout_height="wrap_content"
.sumber
Anda juga dapat mengesampingkan LinearLayoutManager untuk membuat roll recyclerview dengan lancar
sumber
Maaf terlambat ke pesta, tetapi sepertinya ada solusi lain yang bekerja sempurna untuk kasus yang Anda sebutkan.
Jika Anda menggunakan tampilan pendaur ulang di dalam tampilan pendaur ulang, tampaknya berfungsi dengan baik. Saya pribadi telah mencoba dan menggunakannya, dan tampaknya tidak memberikan kelambatan dan tidak ada dendeng sama sekali. Sekarang saya tidak yakin apakah ini adalah praktik yang baik atau tidak, tetapi menumpuk beberapa tampilan pendaur ulang, bahkan tampilan gulir bersarang melambat. Tapi ini sepertinya bekerja dengan baik. Ayo cobalah. Saya yakin bersarang akan baik-baik saja dengan ini.
sumber
Pendekatan lain untuk mengatasi masalah ini adalah menggunakan
ConstraintLayout
di dalamScrollView
:Tapi saya masih akan tetap pada
androidx.core.widget.NestedScrollView
pendekatan, yang diusulkan oleh Yang Peiyong .sumber
** Solusi yang berfungsi untuk saya.
Gunakan NestedScrollView dengan tinggi sebagai wrap_content
// Konten baris Anda ada di sini
sumber