Saya tidak bisa menonaktifkan bergulir di RecyclerView
. Saya mencoba menelepon rv.setEnabled(false)
tetapi saya masih bisa menggulir.
Bagaimana saya bisa menonaktifkan gulir?
android
scroll
android-recyclerview
Zsolt Safrany
sumber
sumber
RecyclerView
jika Anda tidak ingin menggulir?View
di atasRecyclerView
, beralih di antaraVISIBLE
danGONE
sesuai kebutuhan, tetapi dari pendekatan Anda tampaknya masuk akal.Jawaban:
Anda harus mengganti manajer tata letak recycleview Anda untuk ini. Dengan cara ini hanya akan menonaktifkan pengguliran, tidak ada fungsi lainnya. Anda masih dapat menangani klik atau acara sentuh lainnya. Sebagai contoh:-
Asli:
Di sini menggunakan flag "isScrollEnabled" Anda dapat mengaktifkan / menonaktifkan fungsi gulir dari tampilan daur ulang Anda untuk sementara waktu.
Juga:
Timpa penerapan Anda yang sudah ada untuk menonaktifkan pengguliran dan mengizinkan mengklik.
sumber
Jawaban sebenarnya adalah
Info lebih lanjut dalam dokumentasi
sumber
NestedScrollView
:android.support.v4.widget.NestedScrollView
, seperti dijelaskan di sini, oleh chessdork: stackoverflow.com/questions/37846245/...Jawaban NYATA NYATA adalah: Untuk API 21 dan lebih tinggi:
Tidak perlu kode java. Anda dapat mengatur
android:nestedScrollingEnabled="false"
dalam xml:sumber
Ini sedikit solusi hackish tetapi berhasil; Anda dapat mengaktifkan / menonaktifkan gulir di menu
RecyclerView
.Ini adalah
RecyclerView.OnItemTouchListener
mencuri kosong setiap acara sentuh sehingga menonaktifkan targetRecyclerView
.Menggunakannya:
sumber
Ini bekerja untuk saya:
sumber
Custom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
return e.getAction() == MotionEvent.ACTION_MOVE;
alih-alihreturn true;
hanya acara gulir / geser yang dibatalkan.Anda dapat menonaktifkan pengguliran dengan membekukan RecyclerView Anda.
Membekukan:
recyclerView.setLayoutFrozen(true)
Untuk mencairkan:
recyclerView.setLayoutFrozen(false)
sumber
Buat kelas yang memperluas kelas RecyclerView
Ini akan menonaktifkan acara gulir, tetapi bukan acara klik
Gunakan ini di XML Anda lakukan hal berikut:
sumber
Jika Anda hanya menonaktifkan hanya fungsi scroll dari
RecyclerView
maka Anda dapat menggunakansetLayoutFrozen(true);
metodeRecyclerView
. Tapi itu tidak bisa menonaktifkan acara sentuh.sumber
sumber
Ada jawaban yang benar-benar sederhana.
Kode di atas menonaktifkan RecyclerView menggulir secara vertikal.
sumber
Alternatif lain adalah
setLayoutFrozen
, tetapi ia datang dengan banyak efek samping lainnya.https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setLayoutFrozen(boolean)
sumber
Menulis versi kotlin:
pemakaian:
sumber
Perluas
LayoutManager
dan timpacanScrollHorizontally()
dancanScrollVertically()
untuk menonaktifkan pengguliran.Ketahuilah bahwa memasukkan item di awal tidak akan secara otomatis menggulir kembali ke awal, untuk menyiasati ini lakukan sesuatu seperti:
sumber
Saya tahu ini sudah memiliki jawaban yang diterima, tetapi solusinya tidak memperhitungkan kasus penggunaan yang saya temui.
Saya secara khusus membutuhkan item tajuk yang masih dapat diklik, namun menonaktifkan mekanisme gulir RecyclerView. Ini dapat dilakukan dengan kode berikut:
sumber
Seperti yang
setLayoutFrozen
sudah usang, Anda dapat menonaktifkan gulir dengan membekukan RecyclerView Anda dengan menggunakansuppressLayout
.Membekukan:
Untuk mencairkan:
sumber
dalam XML: -
Anda dapat menambahkan
android:nestedScrollingEnabled="false"
dalam file XML tata letak RecyclerView anak
atau
di Jawa: -
childRecyclerView.setNestedScrollingEnabled(false);
ke RecyclerView Anda dalam kode Java.
Menggunakan ViewCompat (Jawa): -
childRecyclerView.setNestedScrollingEnabled(false);
hanya akan berfungsi di android_version> 21 perangkat. untuk bekerja di semua perangkat gunakan yang berikut iniViewCompat.setNestedScrollingEnabled(childRecyclerView, false);
sumber
Entah mengapa jawaban @Alejandro Gracia mulai bekerja hanya setelah beberapa detik. Saya menemukan solusi yang memblokir RecyclerView secara instan:
sumber
Timpa onTouchEvent () dan onInterceptTouchEvent () dan kembalikan false jika Anda tidak membutuhkan OnItemTouchListener sama sekali. Ini tidak menonaktifkan OnClickListeners dari ViewHolders.
sumber
Anda dapat menambahkan baris ini setelah mengatur adaptor Anda
Sekarang recyclerview Anda akan berfungsi dengan scrolling yang lancar
sumber
Saya telah berjuang dalam masalah ini selama beberapa jam, Jadi saya ingin berbagi pengalaman saya, Untuk solusi layoutManager itu baik-baik saja tetapi jika Anda ingin mengaktifkan gulir, pendaur ulang akan kembali ke atas.
Solusi terbaik sejauh ini (setidaknya untuk saya) adalah menggunakan metode @Zsolt Safrany tetapi menambahkan pengambil dan penyetel sehingga Anda tidak perlu menghapus atau menambahkan OnItemTouchListener.
Sebagai berikut
Pemakaian
sumber
Di Kotlin, jika Anda tidak ingin membuat kelas tambahan hanya untuk menetapkan satu nilai, Anda bisa membuat kelas anonim dari LayoutManager:
sumber
Inilah cara saya melakukannya dengan pengikatan data:
Sebagai pengganti "true", saya menggunakan variabel boolean yang berubah berdasarkan kondisi sehingga tampilan pendaur ulang akan beralih antara dinonaktifkan dan diaktifkan.
sumber
Datang dengan sebuah fragmen yang berisi beberapa RecycleView jadi saya hanya perlu satu scrollbar bukan satu scrollbar di setiap RecycleView.
Jadi saya hanya meletakkan ScrollView di wadah induk yang berisi 2 RecycleViews dan digunakan
android:isScrollContainer="false"
dalam RecycleViewsumber
Menambahkan
pada anak Anda dari SrollView atau NestedScrollView (dan orang tua dari ListView, recyclerview, dan gridview)
sumber
Ada cara yang lebih mudah untuk menonaktifkan pengguliran (secara teknis ini lebih tepatnya mencegat peristiwa pengguliran dan mengakhirinya ketika suatu kondisi terpenuhi), hanya menggunakan fungsionalitas standar.
RecyclerView
memiliki metode yang dipanggiladdOnScrollListener(OnScrollListener listener)
, dan hanya dengan ini Anda dapat menghentikannya dari menggulir, seperti:Kasus penggunaan: Katakanlah Anda ingin menonaktifkan pengguliran ketika Anda mengklik salah satu item di dalamnya
RecyclerView
sehingga Anda dapat melakukan beberapa tindakan dengannya, tanpa terganggu dengan menggulir secara tidak sengaja ke item lain, dan ketika Anda selesai melakukannya, cukup klik pada item lagi untuk mengaktifkan gulir. Untuk itu, Anda ingin melampirkanOnClickListener
ke setiap item di dalamnyaRecyclerView
, jadi ketika Anda mengklik item, itu akan beralihisItemSelected
darifalse
ketrue
. Dengan cara ini ketika Anda mencoba untuk menggulir,RecyclerView
akan secara otomatis memanggil metodeonScrollStateChanged
dan sejakisItemSelected
diatur ketrue
, itu akan segera berhenti, sebelumRecyclerView
mendapat kesempatan, yah ... untuk menggulir.Catatan: untuk kegunaan yang lebih baik, coba gunakan
GestureListener
alih-alihOnClickListener
untuk mencegahaccidental
klik.sumber
stopScroll()
bukan untuk membekukan gulir, itu hanya untuk menghentikan / menghentikan gulir recyclerview.isItemSelected
set ketrue
. Kalau tidak, Anda akan memerlukan RecyclerView khusus untuk menonaktifkan scrolling untuk selamanya dan saya ingin menghindarinya karena saya hanya memerlukan sedikit fungsionalitas tambahan, yang disediakan oleh solusi ini.Tambahkan saja ini ke recycleview Anda di xml
seperti ini
sumber
Untuk berhenti menggulir dengan sentuhan tetapi tetap menggulir melalui perintah:
if (appTopBarMessagesRV == null) {appTopBarMessagesRV = findViewById (R.id.mainBarScrollMessagesRV);
sumber