Salah satu solusinya adalah mengimplementasikan OnScrollListenerdan membuat perubahan (seperti menambahkan item, dll.) ListAdapterKe kondisi yang nyaman dalam onScrollmetodenya.
Yang berikut ini ListActivitymemperlihatkan daftar bilangan bulat, mulai dengan 40, menambahkan item ketika pengguna menggulir ke akhir daftar.
Anda jelas harus menggunakan utas terpisah untuk tindakan jangka panjang (seperti memuat data web) dan mungkin ingin menunjukkan kemajuan dalam item daftar terakhir (seperti yang dilakukan pasar atau aplikasi gmail).
ya, bukankah ini akan memicu peningkatan ukuran adaptor jika Anda akan berhenti menggulir di tengah layar? seharusnya hanya memuat 10 berikutnya ketika benar-benar mencapai daftar bagian bawah.
Matthias
9
Saya melihat banyak contoh seperti ini menggunakan BaseAdapter. Ingin menyebutkan bahwa jika Anda menggunakan database, coba gunakan SimpleCursorAdapter. Ketika Anda perlu menambahkan ke daftar, perbarui database Anda, dapatkan kursor baru, dan gunakan SimpleCursorAdapter # changeCursor bersama dengan notifyDataSetChanged. Tidak diperlukan subklasifikasi, dan berkinerja lebih baik daripada BaseAdapter (sekali lagi, hanya jika Anda menggunakan database).
brack
1
Setelah memanggil notifyDataSetChanged (), itu akan masuk daftar teratas, bagaimana saya bisa mencegahnya?
gambar
2
Catatan - Saya menggunakan pendekatan ini, tetapi perlu menambahkan tanda centang untuk saat terlihatCount adalah 0. Untuk setiap daftar, saya mendapatkan satu panggilan balik ke onScroll di mana firstVisible, visibleCount, dan totalCount semuanya 0, yang secara teknis memenuhi persyaratan, tetapi tidak ketika saya ingin memuat lebih banyak.
Eric Mill
5
Masalah lain dengan kode ini adalah bahwa kondisi firstVisible + visibleCount >= totalCountdipenuhi beberapa kali dengan beberapa panggilan ke pendengar. Jika fungsi load-more adalah permintaan web, (kemungkinan besar itu adalah), tambahkan cek lain untuk melihat apakah permintaan sedang berjalan atau tidak. Di sisi lain, periksa apakah totalCount tidak sama dengan jumlah total Sebelumnya, karena kami tidak perlu beberapa permintaan untuk jumlah item yang sama dalam daftar.
Subin Sebastian
94
Hanya ingin menyumbangkan solusi yang saya gunakan untuk aplikasi saya.
Ini juga didasarkan pada OnScrollListenerantarmuka, tetapi saya menemukan itu memiliki kinerja scrolling yang jauh lebih baik pada perangkat low-end, karena tidak ada perhitungan jumlah terlihat / total dilakukan selama operasi gulir.
Biarkan Anda ListFragmentatau ListActivityimplementasikanOnScrollListener
Tambahkan metode berikut ke kelas itu:
@Overridepublicvoid onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount){//leave this empty}@Overridepublicvoid onScrollStateChanged(AbsListView listView,int scrollState){if(scrollState == SCROLL_STATE_IDLE){if(listView.getLastVisiblePosition()>= listView.getCount()-1- threshold){
currentPage++;//load more list items:
loadElements(currentPage);}}}
di mana currentPagehalaman sumber data Anda yang harus ditambahkan ke daftar Anda, dan thresholdjumlah item daftar (dihitung dari akhir) yang seharusnya, jika terlihat, memicu proses pemuatan. Jika Anda mengatur thresholdke 0, misalnya, pengguna harus menggulir ke bagian paling akhir daftar untuk memuat lebih banyak item.
(opsional) Seperti yang Anda lihat, "pemeriksaan beban-lebih" hanya dipanggil ketika pengguna berhenti menggulir. Untuk meningkatkan kegunaan, Anda dapat mengembang dan menambahkan indikator pemuatan ke akhir daftar melalui listView.addFooterView(yourFooterView). Salah satu contoh untuk tampilan footer seperti itu:
Saya mencoba ini tetapi tidak berhasil untuk ListFragment. Bagaimana itu bisa digunakan di ListFragment.
zeeshan
Yah, saya menggunakannya dengan ListFragmentbaik tanpa masalah - cukup ikuti setiap langkah di atas dan Anda akan baik-baik saja;) Atau Anda bisa memberikan pesan kesalahan?
saschoar
Apa yang mungkin Anda lewatkan dijelaskan dalam jawaban SO ini: stackoverflow.com/a/6357957/1478093 -getListView().setOnScrollListener(this)
TBieniek
7
catatan: menambah dan menghapus footer di listview bermasalah (footer tidak muncul jika setAdapter dipanggil sebelum menambahkan footer), saya akhirnya memodifikasi visibilitas tampilan footer secara langsung tanpa menghapusnya.
dvd
Apa yang harus ditambahkan di loadElements (currentPage) ??? Maksud saya, apakah saya memanggil AsyncTask atau utas saya?
android_developer
20
Anda dapat mendeteksi akhir daftar dengan bantuan onScrollListener , kode kerjanya disajikan di bawah ini:
Cara lain untuk melakukan itu (di dalam adaptor) adalah sebagai berikut:
publicView getView(int pos,View v,ViewGroup p){if(pos==getCount()-1){
addMoreData();//should be asynctask or thread}return view;}
Perlu diketahui bahwa metode ini akan dipanggil berkali-kali, jadi Anda perlu menambahkan kondisi lain untuk memblokir beberapa panggilan addMoreData().
Ketika Anda menambahkan semua elemen ke daftar, silakan hubungi notifyDataSetChanged () di dalam adaptor Anda untuk memperbarui tampilan (itu harus dijalankan pada utas UI - runOnUiThread )
Merupakan praktik yang buruk untuk melakukan hal-hal lain selain mengembalikan pemandangan getView. Misalnya, Anda tidak dijamin posdilihat oleh pengguna. Mungkin hanya hal-hal pengukuran ListView.
Thomas Ahle
Saya ingin memuat lebih banyak item setelah 10 item digulir. tapi saya perhatikan bahwa memuat dimulai sebelum item ke-10 terlihat berarti pada item ke-9. Jadi bagaimana cara menghentikan ini?
Itu menggunakan Volley HTTP libraryyang membuat jaringan untuk aplikasi Android lebih mudah dan yang paling penting, lebih cepat. Volley tersedia melalui repositori AOSP terbuka.
Kode yang diberikan menunjukkan:
ListView yang diisi oleh permintaan paginasi HTTP.
Penggunaan NetworkImageView.
Pagination ListView "tanpa ujung" dengan baca-depan.
Mungkin sedikit terlambat tetapi solusi berikut ini terjadi sangat berguna dalam kasus saya. Yang perlu Anda lakukan hanyalah menambah ListView Anda Footerdan membuatnya addOnLayoutChangeListener.
ListView listView1 =(ListView) v.findViewById(R.id.dialogsList);// Your listViewView loadMoreView = getActivity().getLayoutInflater().inflate(R.layout.list_load_more,null);// Getting your layout of FooterView, which will always be at the bottom of your listview. E.g. you may place on it the ProgressBar or leave it empty-layout.
listView1.addFooterView(loadMoreView);// Adding your View to your listview ...
loadMoreView.addOnLayoutChangeListener(newView.OnLayoutChangeListener(){@Overridepublicvoid onLayoutChange(View v,int left,int top,int right,int bottom,int oldLeft,int oldTop,int oldRight,int oldBottom){Log.d("Hey!","Your list has reached bottom");}});
Acara ini terjadi sekali ketika footer menjadi terlihat dan bekerja seperti pesona.
Kunci dari masalah ini adalah untuk mendeteksi peristiwa yang memuat lebih banyak, memulai permintaan async untuk data dan kemudian memperbarui daftar. Juga diperlukan adaptor dengan indikator memuat dan dekorator lainnya. Bahkan, masalahnya sangat rumit dalam beberapa kasus sudut. Hanya OnScrollListenerimplementasi saja tidak cukup, karena kadang-kadang item tidak memenuhi layar.
Saya telah menulis paket pribadi yang mendukung daftar tanpa akhir RecyclerView, dan juga menyediakan implementasi loader async AutoPagerFragmentyang membuatnya sangat mudah untuk mendapatkan data dari sumber multi-halaman. Itu dapat memuat halaman yang Anda inginkan ke dalam RecyclerViewacara khusus, tidak hanya halaman berikutnya.
Saya telah bekerja di solusi lain yang sangat mirip dengan itu, tetapi, saya menggunakan footerViewuntuk memberi kemungkinan kepada pengguna mengunduh lebih banyak elemen dengan mengklik footerView, saya menggunakan "menu" yang ditunjukkan di atas ListViewdan di bagian bawah tampilan induk, "menu" ini menyembunyikan bagian bawahnya ListView, jadi, ketika menu listViewbergulir menghilang dan ketika status gulir idle, menu muncul lagi, tetapi ketika pengguna menggulir ke ujung menu listView, saya "meminta" untuk tahu jika footerViewditampilkan dalam kasus itu, menu tidak muncul dan pengguna dapat melihat footerViewuntuk memuat lebih banyak konten. Berikut kodenya:
Saya tahu ini adalah pertanyaan lama dan dunia Android sebagian besar telah beralih ke RecyclerViews, tetapi bagi siapa pun yang tertarik, Anda mungkin menemukan perpustakaan ini sangat menarik.
Ia menggunakan BaseAdapter yang digunakan dengan ListView untuk mendeteksi kapan daftar telah digulir ke item terakhir atau ketika sedang digulir menjauh dari item terakhir.
Itu datang dengan contoh proyek (hampir 100 baris kode aktivitas) yang dapat digunakan untuk dengan cepat memahami cara kerjanya.
The loadMoreitem tombol atau elemen ui lain yang mungkin diklik untuk mengambil lebih banyak data dari url. Ketika ditempatkan sebagaimana dijelaskan dalam kode, adaptor tahu persis kapan harus menunjukkan tombol itu dan kapan harus menonaktifkannya. Cukup buat tombol di xml Anda dan letakkan seperti yang ditunjukkan pada kode adaptor di atas.
Jawaban:
Salah satu solusinya adalah mengimplementasikan
OnScrollListener
dan membuat perubahan (seperti menambahkan item, dll.)ListAdapter
Ke kondisi yang nyaman dalamonScroll
metodenya.Yang berikut ini
ListActivity
memperlihatkan daftar bilangan bulat, mulai dengan 40, menambahkan item ketika pengguna menggulir ke akhir daftar.Anda jelas harus menggunakan utas terpisah untuk tindakan jangka panjang (seperti memuat data web) dan mungkin ingin menunjukkan kemajuan dalam item daftar terakhir (seperti yang dilakukan pasar atau aplikasi gmail).
sumber
firstVisible + visibleCount >= totalCount
dipenuhi beberapa kali dengan beberapa panggilan ke pendengar. Jika fungsi load-more adalah permintaan web, (kemungkinan besar itu adalah), tambahkan cek lain untuk melihat apakah permintaan sedang berjalan atau tidak. Di sisi lain, periksa apakah totalCount tidak sama dengan jumlah total Sebelumnya, karena kami tidak perlu beberapa permintaan untuk jumlah item yang sama dalam daftar.Hanya ingin menyumbangkan solusi yang saya gunakan untuk aplikasi saya.
Ini juga didasarkan pada
OnScrollListener
antarmuka, tetapi saya menemukan itu memiliki kinerja scrolling yang jauh lebih baik pada perangkat low-end, karena tidak ada perhitungan jumlah terlihat / total dilakukan selama operasi gulir.ListFragment
atauListActivity
implementasikanOnScrollListener
Tambahkan metode berikut ke kelas itu:
di mana
currentPage
halaman sumber data Anda yang harus ditambahkan ke daftar Anda, danthreshold
jumlah item daftar (dihitung dari akhir) yang seharusnya, jika terlihat, memicu proses pemuatan. Jika Anda mengaturthreshold
ke0
, misalnya, pengguna harus menggulir ke bagian paling akhir daftar untuk memuat lebih banyak item.(opsional) Seperti yang Anda lihat, "pemeriksaan beban-lebih" hanya dipanggil ketika pengguna berhenti menggulir. Untuk meningkatkan kegunaan, Anda dapat mengembang dan menambahkan indikator pemuatan ke akhir daftar melalui
listView.addFooterView(yourFooterView)
. Salah satu contoh untuk tampilan footer seperti itu:(opsional) Akhirnya, hapus indikator memuat itu dengan menelepon
listView.removeFooterView(yourFooterView)
jika tidak ada lagi item atau halaman.sumber
ListFragment
baik tanpa masalah - cukup ikuti setiap langkah di atas dan Anda akan baik-baik saja;) Atau Anda bisa memberikan pesan kesalahan?getListView().setOnScrollListener(this)
Anda dapat mendeteksi akhir daftar dengan bantuan onScrollListener , kode kerjanya disajikan di bawah ini:
Cara lain untuk melakukan itu (di dalam adaptor) adalah sebagai berikut:
Perlu diketahui bahwa metode ini akan dipanggil berkali-kali, jadi Anda perlu menambahkan kondisi lain untuk memblokir beberapa panggilan
addMoreData()
.Ketika Anda menambahkan semua elemen ke daftar, silakan hubungi notifyDataSetChanged () di dalam adaptor Anda untuk memperbarui tampilan (itu harus dijalankan pada utas UI - runOnUiThread )
sumber
getView
. Misalnya, Anda tidak dijaminpos
dilihat oleh pengguna. Mungkin hanya hal-hal pengukuran ListView.Pada
Ognyan Bankov GitHub
saya menemukan solusi yang sederhana dan berfungsi!Itu menggunakan
Volley HTTP library
yang membuat jaringan untuk aplikasi Android lebih mudah dan yang paling penting, lebih cepat. Volley tersedia melalui repositori AOSP terbuka.Kode yang diberikan menunjukkan:
Untuk konsistensi di masa depan saya membayar repo Bankov .
sumber
Berikut ini adalah solusi yang juga memudahkan untuk menampilkan tampilan pemuatan di akhir ListView saat sedang memuat.
Anda dapat melihat kelas di sini:
https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java - Pembantu agar memungkinkan untuk menggunakan fitur tanpa memperluas dari SimpleListViewWithLoadingIndicator.
https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/listener/EndlessScrollListener.java - Pendengar yang mulai memuat data saat pengguna akan mencapai bagian bawah ListView.
https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SimpleListViewWithLoadingIndicator.java - The EndlessListView. Anda dapat menggunakan kelas ini secara langsung atau memperluas dari itu.
sumber
Mungkin sedikit terlambat tetapi solusi berikut ini terjadi sangat berguna dalam kasus saya. Yang perlu Anda lakukan hanyalah menambah ListView Anda
Footer
dan membuatnyaaddOnLayoutChangeListener
.http://developer.android.com/reference/android/widget/ListView.html#addFooterView(android.view.View)
Sebagai contoh:
Acara ini terjadi sekali ketika footer menjadi terlihat dan bekerja seperti pesona.
sumber
Kunci dari masalah ini adalah untuk mendeteksi peristiwa yang memuat lebih banyak, memulai permintaan async untuk data dan kemudian memperbarui daftar. Juga diperlukan adaptor dengan indikator memuat dan dekorator lainnya. Bahkan, masalahnya sangat rumit dalam beberapa kasus sudut. Hanya
OnScrollListener
implementasi saja tidak cukup, karena kadang-kadang item tidak memenuhi layar.Saya telah menulis paket pribadi yang mendukung daftar tanpa akhir
RecyclerView
, dan juga menyediakan implementasi loader asyncAutoPagerFragment
yang membuatnya sangat mudah untuk mendapatkan data dari sumber multi-halaman. Itu dapat memuat halaman yang Anda inginkan ke dalamRecyclerView
acara khusus, tidak hanya halaman berikutnya.Berikut alamatnya: https://github.com/SphiaTower/AutoPagerRecyclerManager
sumber
Solusi terbaik sejauh ini yang saya lihat adalah di perpustakaan FastAdapter untuk pandangan pendaur ulang. Itu memiliki
EndlessRecyclerOnScrollListener
.Berikut ini adalah contoh penggunaan: EndlessScrollListActivity
Setelah saya menggunakannya untuk daftar gulir tanpa akhir, saya menyadari bahwa pengaturannya sangat kuat. Saya pasti akan merekomendasikannya.
sumber
Saya telah bekerja di solusi lain yang sangat mirip dengan itu, tetapi, saya menggunakan
footerView
untuk memberi kemungkinan kepada pengguna mengunduh lebih banyak elemen dengan mengklikfooterView
, saya menggunakan "menu" yang ditunjukkan di atasListView
dan di bagian bawah tampilan induk, "menu" ini menyembunyikan bagian bawahnyaListView
, jadi, ketika menulistView
bergulir menghilang dan ketika status gulir idle, menu muncul lagi, tetapi ketika pengguna menggulir ke ujung menulistView
, saya "meminta" untuk tahu jikafooterView
ditampilkan dalam kasus itu, menu tidak muncul dan pengguna dapat melihatfooterView
untuk memuat lebih banyak konten. Berikut kodenya:Salam.
sumber
Saya tahu ini adalah pertanyaan lama dan dunia Android sebagian besar telah beralih ke RecyclerViews, tetapi bagi siapa pun yang tertarik, Anda mungkin menemukan perpustakaan ini sangat menarik.
Ia menggunakan BaseAdapter yang digunakan dengan ListView untuk mendeteksi kapan daftar telah digulir ke item terakhir atau ketika sedang digulir menjauh dari item terakhir.
Itu datang dengan contoh proyek (hampir 100 baris kode aktivitas) yang dapat digunakan untuk dengan cepat memahami cara kerjanya.
Penggunaan sederhana:
Adaptor untuk menampung objek Boy akan terlihat seperti:
Perhatikan bagaimana metode getView BoysAdapter mengembalikan panggilan ke metode superclass EndlessAdapter
getView
. Ini 100% penting.Sekarang untuk membuat adaptor, lakukan:
The
loadMore
item tombol atau elemen ui lain yang mungkin diklik untuk mengambil lebih banyak data dari url. Ketika ditempatkan sebagaimana dijelaskan dalam kode, adaptor tahu persis kapan harus menunjukkan tombol itu dan kapan harus menonaktifkannya. Cukup buat tombol di xml Anda dan letakkan seperti yang ditunjukkan pada kode adaptor di atas.Nikmati.
sumber