Saya ingin berubah ListView
menjadi RecyclerView
. Saya ingin menggunakan onScroll
dari OnScrollListener
dalam RecyclerView
untuk menentukan apakah pengguna menggulir ke akhir daftar.
Bagaimana saya tahu jika pengguna menggulir ke bagian akhir daftar sehingga saya bisa mengambil data baru dari layanan REST?
cwac-endless
untukListView
.Jawaban:
Terima kasih kepada @Kushal dan ini adalah bagaimana saya menerapkannya
Jangan lupa menambahkan
sumber
StaggeredGridLayoutManager
mLayoutManager.findLastCompletelyVisibleItemPosition()==mLayoutManager.getItemCount()-1
findFirstVisibleItemPosition()
tidak menyelesaikannya Anda harus berubahRecyclerView.LayoutManager
keLinearLayoutManager
loading = true
lagi?loading = true
setelah//Do pagination
. jika tidak, kode ini hanya akan berjalan sekali dan Anda tidak dapat memuat lebih banyak item.Buat variabel-variabel ini.
Atur pada Gulir untuk tampilan pendaur ulang.
dan untuk kotak
Bersenang-senanglah dengan gulungan tanpa akhir Anda !! ^. ^
Karena Android sekarang secara resmi mendukung Kotlin, ini adalah pembaruan untuk hal yang sama -
Buat OnScrollListener
dan tambahkan ke RecyclerView Anda seperti ini
Untuk contoh kode lengkap, silakan lihat repo Github ini .
sumber
findFirstVisibleItemPosition()
metode ini hanya tersedia dengan LinearLayoutManager, saya tidak tahu cara membuatnya bekerja.visibleItemCount = mLayoutManager.getChildCount();
berperilaku sama dengan menggunakanvisibleItemCount = mRecyclerView.getChildCount();
.int[] firstVisibleItemPositions = new int[yourNumberOfColumns]; pastVisiblesItems = layoutManager.findFirstVisibleItemPositions(firstVisibleItemPositions)[0];
Bagi mereka yang hanya ingin mendapatkan pemberitahuan ketika item terakhir ditampilkan secara total, Anda dapat menggunakannya
View.canScrollVertically()
.Inilah implementasi saya:
Catatan: Anda dapat menggunakan
recyclerView.getLayoutManager().canScrollVertically()
jika Anda ingin mendukung API <14.sumber
RecyclerView
Anda akan beruntung lagi, karena Anda hanya dapat membuat salinan statisView.canScrollVertically()
sejak metode terkait ditandai publik, bukan dilindungiRecyclerView
. Anda juga dapat memperluasRecyclerView
untuk menerapkan kembalicanScrollVertically()
jika Anda mau. Cara ketiga dan sederhana adalah meneleponrecyclerView.getLayoutManager().canScrollVertically()
. Diedit dalam jawaban saya.Ini pendekatan lain. Ini akan bekerja dengan manajer tata letak apa pun.
Untuk pemahaman detail saya menulis posting blog dan contoh proyek mendapatkannya di sini http://sab99r.com/blog/recyclerview-endless-load-more/
MyAdapter.java
MyActivity.java
sumber
Jawaban saya adalah versi modifikasi Noor. Saya lulus dari
ListView
tempat sayaEndlessScrollListener
(yang dapat Anda temukan dengan mudah di banyak jawaban di SO) keRecyclerView
jadi saya ingin aEndlessRecyclScrollListener
dengan mudah memperbarui pendengar masa lalu saya.Jadi ini kodenya, semoga membantu:
sumber
Bagi saya, ini sangat sederhana:
Hati-hati dengan pekerjaan asinkron: mLading harus diubah pada akhir pekerjaan asinkron. Semoga bermanfaat!
sumber
Sebagian besar jawaban mengasumsikan
RecyclerView
kegunaan aLinearLayoutManager
, atauGridLayoutManager
, atau bahkanStaggeredGridLayoutManager
, atau dengan asumsi bahwa penggulirannya vertikal atau horyzontal, tetapi tidak ada yang memposting jawaban yang sepenuhnya umum .Menggunakan
ViewHolder
adaptor jelas bukan solusi yang baik. Adaptor mungkin memiliki lebih dari 1RecyclerView
menggunakannya. Itu "menyesuaikan" isinya. Itu harus menjadi Recycler View (yang merupakan satu kelas yang bertanggung jawab atas apa yang saat ini ditampilkan kepada pengguna, dan bukan adaptor yang hanya bertanggung jawab untuk menyediakan konten keRecyclerView
) yang harus memberi tahu sistem Anda bahwa diperlukan lebih banyak item (untuk beban).Inilah solusi saya, tidak menggunakan apa pun selain kelas-kelas abstrak dari RecyclerView (RecycerView.LayoutManager dan RecycerView.Adapter):
sumber
LayoutManagers
hanya untuk satu saat: pindahkan kode perhitungan Anda dalam metode scrollListener lain -onScrollStateChanged
alih - alih pindahkanonScrolled
. DanonScrollStateChanged
cukup periksa:if(newState == RecyclerView.SCROLL_STATE_IDLE) { // calculation code }
Meskipun jawaban yang diterima bekerja dengan baik, solusi di bawah ini menggunakan addOnScrollListener karena setOnScrollListener sudah usang, dan mengurangi jumlah variabel, dan jika kondisi.
sumber
Meskipun ada begitu banyak jawaban untuk pertanyaan ini, saya ingin berbagi pengalaman kami dalam membuat tampilan daftar tanpa akhir. Kami baru-baru ini mengimplementasikan Manajer Layout Carousel kustom yang dapat bekerja dalam siklus dengan menggulir daftar secara tak terbatas serta hingga titik tertentu. Berikut ini penjelasan terperinci tentang GitHub .
Saya sarankan Anda melihat artikel ini dengan rekomendasi singkat tapi berharga untuk membuat LayoutManagers khusus: http://cases.azoft.com/create-custom-layoutmanager-android/
sumber
Dengan kekuatan fungsi ekstensi Kotlin, kode dapat terlihat jauh lebih elegan. Letakkan ini di mana pun Anda inginkan (saya memilikinya di dalam file ExtensionFunctions.kt):
Dan kemudian gunakan seperti ini:
Solusi ini didasarkan pada jawaban Kushal Sharma. Namun, ini sedikit lebih baik karena:
onScrollStateChanged
bukanonScroll
. Ini lebih baik karenaonScroll
dipanggil setiap kali ada jenis gerakan di RecyclerView, sedangkanonScrollStateChanged
hanya dipanggil ketika keadaan RecyclerView diubah. MenggunakanonScrollStateChanged
akan menghemat waktu CPU Anda dan, sebagai akibatnya, baterai.sumber
SwipeRefreshLayout's setOnRefreshListener the addOnScrolledToEnd is not working
kelas dalam pribadi PullToRefresh: SwipeRefreshLayout.OnRefreshListener {override fun onRefresh () {pbViewMore !!. Visibility = View.GONE pageCount = 0 courseList.clear () // memanggil asynctask di sini srlNoMessageRefreshLayoutoutout !! ! .isRefreshing = false}}Inilah cara saya melakukannya, sederhana dan pendek:
sumber
OK, saya melakukannya dengan menggunakan metode onBindViewHolder dari RecyclerView.Adapter.
Adaptor:
Fragmen (atau Aktivitas) :
sumber
onBindViewHolder()
, itu berfungsi seperti pesona. Implementasinya kecil dibandingkan dengan pendengar gulir dan lebih mudah digunakan.Cara saya mendeteksi acara pemuatan bukan untuk mendeteksi pengguliran, tetapi untuk mendengarkan apakah tampilan terakhir dilampirkan. Jika tampilan terakhir dilampirkan, saya menganggapnya sebagai waktu untuk memuat lebih banyak konten.
sumber
Saya akan mencoba untuk memperluas metode yang digunakan
LayoutManager
(misalnyaLinearLayoutManager
) dan menimpascrollVerticallyBy()
. Pertama, saya akan meneleponsuper
dulu dan kemudian memeriksa kembali nilai integer. Jika nilainya sama dengan0
maka batas bawah atau atas tercapai. Maka saya akan menggunakanfindLastVisibleItemPosition()
metode untuk mengetahui batas mana yang tercapai dan memuat lebih banyak data jika diperlukan. Hanya sebuah ide.Selain itu, Anda bahkan dapat mengembalikan nilai Anda dari metode itu yang memungkinkan overscroll dan menampilkan indikator "memuat".
sumber
sumber
onScrollStateChanged()
tidak akan berfungsi karena hanya akan dipanggil ketika Anda mengubah status gulungan dan tidak saat Anda sedang menggulir. Anda harus menggunakanonScrolled()
metode ini.Saya mencapai implementasi tipe pengguliran tak terbatas menggunakan logika ini dalam
onBindViewHolder
metodeRecyclerView.Adapter
kelas saya .Dengan kode ini ketika RecyclerView sampai ke item terakhir, ia menambah halaman saat ini dan panggilan balik pada antarmuka yang bertanggung jawab untuk memuat lebih banyak data dari api dan menambahkan hasil baru ke adaptor.
Saya dapat memposting contoh yang lebih lengkap jika ini tidak jelas?
sumber
Untuk orang-orang yang menggunakan StaggeredGridLayoutManager di sini adalah implementasi saya, ini berfungsi untuk saya.
sumber
Ada perpustakaan yang mudah digunakan untuk paginate bernama ini . Mendukung ListView dan RecyclerView (LinearLayout, GridLayout dan StaggeredGridLayout).
Berikut ini tautan ke proyek di Github
sumber
Buat kelas abstrak dan rentangkan RecyclerView.OnScrollListener
dalam aktivitas (atau fragmen) tambahkan addOnScrollListener ke recyclerView
sumber
Saya punya contoh yang cukup rinci tentang cara membuat paginasi dengan RecyclerView. Pada tingkat tinggi, saya memiliki satu set PAGE_SIZE, katakanlah 30. Jadi saya meminta 30 item dan jika saya mendapatkan 30 kembali maka saya meminta halaman berikutnya. Jika saya mendapatkan kurang dari 30 item, saya menandai variabel untuk menunjukkan bahwa halaman terakhir telah tercapai dan kemudian saya berhenti meminta lebih banyak halaman. Lihatlah dan beri tahu saya apa yang Anda pikirkan.
https://medium.com/@etiennelawlor/pagination-with-recyclerview-1cb7e66a502b
sumber
Di sini solusi saya menggunakan AsyncListUtil , di web mengatakan: Perhatikan bahwa kelas ini menggunakan utas tunggal untuk memuat data, sehingga cocok untuk memuat data dari penyimpanan sekunder seperti disk, tetapi tidak dari jaringan. tetapi saya menggunakan odata untuk membaca data dan berfungsi dengan baik. Saya kehilangan contoh entitas data dan metode jaringan saya. Saya hanya menyertakan contoh adaptor.
sumber
@kushal @abdulaziz
Mengapa tidak menggunakan logika ini saja?
sumber
end_of_list
kondisi hanya akan dipanggil sekali. Bendera_isLastItem
adalah variabel global dalam aktivitas yang memiliki nilai defaultfalse
. Apa yang saya lakukan adalah menjalankan tugas latar belakang setelah mendeteksi akhir daftar, mengambil halaman berikutnya kemudian memberitahukan adaptor dataset baru, dan akhirnya menetapkan_isLastItem
ke false lagi.Coba di bawah ini:
sumber
LoadMoreRecyclerView
WrapperLinearLayout
// Tambahkan dalam xml like
OnCreate atau onViewCreated
hubungi Layanan Anda
sumber
Dimungkinkan juga untuk mengimplementasikan tanpa scroll listener, menggunakan logika murni dari model data saja. Tampilan gulir mengharuskan untuk mendapatkan item berdasarkan posisi serta jumlah item maksimal. Model dapat memiliki logika latar belakang untuk mengambil item yang diperlukan dalam potongan, bukan satu per satu, dan melakukan ini di utas latar belakang, memberi tahu tampilan ketika data siap.
Pendekatan ini memungkinkan untuk memiliki antrian pengambilan yang lebih memilih item yang paling baru-baru ini diminta (sehingga saat ini terlihat) daripada pengiriman yang lebih lama (kemungkinan besar sudah digulirkan), mengontrol jumlah utas paralel untuk digunakan dan hal-hal sejenisnya. Kode sumber lengkap untuk pendekatan ini (aplikasi demo dan pustaka yang dapat digunakan kembali) tersedia di sini .
sumber
Ada metode
public void setOnScrollListener (RecyclerView.OnScrollListener listener)
di https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setOnScrollListener%28android.support.v7.widget.RecyclerView.OnScrollListener%29 . Gunakan ituEDIT:
Ganti
onScrollStateChanged
metode di dalamonScrollListener
dan lakukan inisumber
onScrollStateChanged
onScrollStateChanged
tidak akan berfungsi karena hanya akan dipanggil ketika Anda mengubah status gulungan dan tidak saat Anda sedang menggulir.onScrollStateChanged
menentukan bahwa pengguna menggulir ke item terakhir?Periksa ini setiap hal dijelaskan secara rinci: Pagination menggunakan RecyclerView Dari A ke Z
loadMoreItems ():
di MyAdapter:
sumber
Tidak satu pun dari jawaban ini yang memperhitungkan apakah daftar itu terlalu kecil atau tidak.
Berikut adalah sepotong kode yang telah saya gunakan yang berfungsi pada RecycleViews di kedua arah.
sumber
Aku membiarkanmu aproximation ku. Bekerja dengan baik untuk saya.
Saya harap ini membantu Anda.
sumber
Solusi ini sangat cocok untuk saya.
sumber