Saya menggunakan CoordinatorLayout baru dengan AppBarLayout dan CollapsingToolbarLayout. Di bawah AppBarLayout, saya memiliki RecyclerView dengan daftar konten.
Saya telah memverifikasi bahwa fling scrolling berfungsi pada RecyclerView ketika saya menggulir daftar ke atas dan ke bawah. Namun, saya juga ingin AppBarLayout untuk menggulir dengan lancar saat ekspansi.
Saat menggulir ke atas untuk memperluas CollaspingToolbarLayout, gulir segera berhenti begitu mengangkat jari Anda dari layar. Jika Anda menggulir ke atas dalam gerakan cepat, terkadang CollapsingToolbarLayout kembali runtuh juga. Perilaku ini dengan RecyclerView tampaknya berfungsi jauh berbeda dari ketika menggunakan NestedScrollView.
Saya sudah mencoba untuk mengatur properti gulir yang berbeda pada recyclerview tetapi saya belum dapat mengetahuinya.
Berikut adalah video yang menunjukkan beberapa masalah pengguliran. https://youtu.be/xMLKoJOsTAM
Berikut adalah contoh yang menunjukkan masalah dengan RecyclerView (CheeseDetailActivity). https://github.com/tylerjroach/cheesesquare
Ini adalah contoh asli yang menggunakan NestedScrollView dari Chris Banes. https://github.com/chrisbanes/cheesesquare
Jawaban:
Jawaban Kirill Boyarshinov hampir benar.
Masalah utama adalah bahwa RecyclerView kadang-kadang memberikan arah yang salah, jadi jika Anda menambahkan kode berikut untuk jawabannya, ia berfungsi dengan benar:
Saya harap ini membantu.
sumber
if (target instanceof SwipeRefreshLayout && velocityY < 0) { target = ((SwipeRefreshLayout) target).getChildAt(0); }
beforeif (target instanceof RecyclerView && velocityY < 0) {
Tampaknya
v23
pembaruan belum memperbaikinya.Saya telah menemukan semacam peretasan untuk memperbaikinya dengan melemparkan. Caranya adalah dengan mempertimbangkan kembali peristiwa melempar jika anak teratas ScrollingView dekat dengan awal data dalam Adaptor.
Gunakan dalam tata letak Anda seperti itu:
SUNTING : Pemrosesan ulang peristiwa fling sekarang didasarkan pada
verticalScrollOffset
bukan jumlah item pada dari atasRecyclerView
.EDIT2: Periksa target sebagai
ScrollingView
contoh antarmuka bukanRecyclerView
. KeduanyaRecyclerView
danNestedScrollingView
mengimplementasikannya.sumber
verticalScrollOffset
yang lebih umum. Sekarang acara melempar akan dipertimbangkan kembali ketikarecyclerView
digulir ke atas.target instanceof RecyclerView
ketarget instanceof NestedScrollView
, atau lebih untuk generiktarget instanceof ScrollingView
. Saya memperbarui jawabannya.Saya telah menemukan perbaikan dengan menerapkan OnScrollingListener ke recyclerView. sekarang ini bekerja dengan sangat baik. Masalahnya adalah bahwa recyclerview memberikan nilai yang dikonsumsi salah dan perilaku tidak tahu kapan recyclerview digulir ke atas.
sumber
CoordinatorLayout
danViewPager
mengatur terima kasih banyak untuk solusi yang paling ditunggu-tunggu ini. Tolong tuliskan GIST untuk hal yang sama sehingga pengembang lainnya juga dapat memperoleh manfaat darinya. Saya juga membagikan solusi ini. Terima kasih lagi.Sudah diperbaiki sejak desain dukungan 26.0.0.
sumber
Ini adalah versi mulus dari Desain Dukungan Google AppBarLayout. Jika Anda menggunakan AppBarLayout, Anda akan tahu ada masalah dengan fling.
Lihat Perpustakaan di sini .. https://github.com/henrytao-me/smooth-app-bar-layout
sumber
Ini adalah bug recyclerview. Seharusnya diperbaiki di v23.1.0.
lihat https://code.google.com/p/android/issues/detail?id=177729
sumber
v26.0.1
!Ini adalah Layout saya dan gulirnya berfungsi seperti seharusnya.
sumber
Solusi saya sejauh ini, berdasarkan Mak Sing dan Manolo Garcia jawaban .
Itu tidak sepenuhnya sempurna. Untuk saat ini saya tidak tahu bagaimana cara menghitung ulang kecepatan valide untuk menghindari efek aneh: appbar dapat meluas lebih cepat dari kecepatan gulir. Tetapi status dengan appbar yang diperluas dan tampilan pendaur ulang yang digulir tidak dapat dijangkau.
sumber
Field viewFlingerField = recyclerView.getClass().getDeclaredField("mViewFlinger"); viewFlingerField.setAccessible(true); Object flinger = viewFlingerField.get(recyclerView); Field scrollerField = flinger.getClass().getDeclaredField("mScroller"); scrollerField.setAccessible(true); ScrollerCompat scroller = (ScrollerCompat) scrollerField.get(flinger); velocity = Math.signum(mVelocity) * Math.abs(scroller.getCurrVelocity());
Dalam kasus saya, saya mendapatkan masalah di mana si melemparkan
RecyclerView
tidak akan menggulirkannya dengan lancar, membuatnya macet.Ini karena, untuk beberapa alasan, saya lupa bahwa saya telah memasukkan
RecyclerView
aNestedScrollView
.Itu kesalahan konyol, tapi butuh beberapa saat untuk mengetahuinya ...
sumber
Saya menambahkan pandangan ketinggian 1dp di dalam AppBarLayout dan kemudian bekerja jauh lebih baik. Ini adalah tata letak saya.
sumber
Sudah beberapa solusi yang cukup populer di sini, tetapi setelah bermain dengan mereka, saya datang dengan solusi yang lebih sederhana yang bekerja dengan baik untuk saya. Solusi saya juga memastikan bahwa
AppBarLayout
itu hanya diperluas ketika konten yang dapat digulir mencapai bagian atas, sebuah keunggulan dibandingkan solusi lain di sini.sumber
Jawaban yang diterima tidak berhasil untuk saya karena saya punya
RecyclerView
di dalam aSwipeRefreshLayout
dan aViewPager
. Ini adalah versi yang disempurnakan yang mencariRecyclerView
hierarki dan harus berfungsi untuk tata letak apa pun:sumber
Jawaban: Ini diperbaiki di perpustakaan dukungan v26
tetapi v26 memiliki beberapa masalah dalam melemparkan. Terkadang, AppBar memantul kembali bahkan meskipun melempar tidak terlalu keras.
Bagaimana cara menghapus efek memantul pada appbar?
Jika Anda mengalami masalah yang sama saat memperbarui untuk mendukung v26, inilah ringkasan jawaban ini .
sumber
Julian Os benar.
Jawaban Manolo Garcia tidak berfungsi jika recyclerview di bawah ambang batas dan gulir. Anda harus membandingkan tampilan
offset
pendaur ulang danvelocity to the distance
, bukan posisi item.Saya membuat versi java dengan mengacu pada kode kotlin julian dan kurangi refleksi.
sumber
BaseApplication
Saya telah menemukan perbaikannya oleh Eniz Bilgin https://stackoverflow.com/a/45090239/7639018
Masalahnya telah dipecahkan dengan perpustakaan di repositori ini.
( https://developer.android.com/topic/libraries/support-library/setup.html )
sumber
Dengan referensi ke pelacak masalah Google , telah diperbaiki dengan versi Android 26.0.0-beta2 perpustakaan dukungan
Harap perbarui perpustakaan dukungan Android Anda versi 26.0.0-beta2.
Jika ada masalah, laporkan di pelacak masalah Google mereka akan membuka kembali untuk memeriksa.
sumber
Menambahkan jawaban lain di sini sebagai yang di atas tidak memenuhi kebutuhan saya sepenuhnya atau tidak bekerja dengan baik. Yang ini sebagian didasarkan pada ide-ide yang tersebar di sini.
Jadi apa yang dilakukan orang ini?
Skenario ke bawah melemparkan: Jika AppBarLayout runtuh, itu memungkinkan RecyclerView melemparkan sendiri tanpa melakukan apa pun. Jika tidak, itu akan merobohkan AppBarLayout dan mencegah RecyclerView dari melakukan hubungan asmara. Segera setelah itu diciutkan (sampai pada titik yang diminta oleh kecepatan yang diberikan) dan jika ada kecepatan yang tersisa, RecyclerView akan terlempar dengan kecepatan asli minus apa yang dikonsumsi oleh AppBarLayout yang baru saja runtuh.
Skenario ke atas melempar: Jika gulir offset RecyclerView tidak nol, itu akan terlempar dengan kecepatan asli. Segera setelah itu selesai dan jika masih ada kecepatan yang tersisa (yaitu RecyclerView digulir ke posisi 0), AppBarLayout akan diperluas ke titik bahwa kecepatan asli dikurangi permintaan yang baru dikonsumsi. Jika tidak, AppBarLayout akan diperluas hingga ke titik yang dituntut oleh kecepatan asli.
AFAIK, ini adalah perilaku yang berubah-ubah.
Ada banyak refleksi yang terlibat, dan itu cukup khusus. Namun tidak ada masalah yang ditemukan. Itu juga ditulis di Kotlin, tetapi memahaminya seharusnya tidak ada masalah. Anda dapat menggunakan plugin IntelliJ Kotlin untuk mengkompilasinya ke bytecode -> dan mendekompilasinya kembali ke Jawa. Untuk menggunakannya, letakkan dalam paket android.support.v7.widget dan tetapkan sebagai AppatorbayL's CoordinatorLayout.LayoutParams perilaku dalam kode (atau tambahkan konstruktor xml yang berlaku atau sesuatu)
sumber
ini solusi saya di proyek saya.
cukup hentikan mScroller saat mendapatkan Action_Down
xml:
FixAppBarLayoutBehavior.java:
sumber
untuk androidx,
Jika file manifes Anda memiliki baris android: hardwareAccelerated = "false", hapuslah.
sumber