Dapatkah saya mengetahui apakah ListView saya di-scroll ke bawah? Maksud saya, item terakhir terlihat sepenuhnya.
105
Diedit :
Karena saya telah menyelidiki subjek khusus ini di salah satu aplikasi saya, saya dapat menulis jawaban tambahan untuk pembaca selanjutnya dari pertanyaan ini.
Menerapkan OnScrollListener
, mengatur Anda ListView
's onScrollListener
dan kemudian Anda harus mampu menangani hal-hal dengan benar.
Sebagai contoh:
private int preLast;
// Initialization stuff.
yourListView.setOnScrollListener(this);
// ... ... ...
@Override
public void onScroll(AbsListView lw, final int firstVisibleItem,
final int visibleItemCount, final int totalItemCount)
{
switch(lw.getId())
{
case R.id.your_list_id:
// Make your calculation stuff here. You have all your
// needed info from the parameters of this function.
// Sample calculation to determine if the last
// item is fully visible.
final int lastItem = firstVisibleItem + visibleItemCount;
if(lastItem == totalItemCount)
{
if(preLast!=lastItem)
{
//to avoid multiple calls for last item
Log.d("Last", "Last");
preLast = lastItem;
}
}
}
}
listview
yaitustackFromBottom
? Saya mencobaif (0 == firstVisibleItem){//listviewtop}
tetapi itu dipanggil berulang kali.Jawaban terlambat, tetapi jika Anda hanya ingin memeriksa apakah ListView Anda di-scroll ke bawah atau tidak, tanpa membuat event listener, Anda dapat menggunakan pernyataan-if ini:
Pertama, ia memeriksa apakah posisi terakhir yang mungkin terlihat. Kemudian ia memeriksa apakah bagian bawah tombol terakhir sejajar dengan bagian bawah ListView. Anda dapat melakukan sesuatu yang serupa untuk mengetahui apakah semuanya berjalan di atas:
sumber
getChildCount()
mengembalikan tampilan di viewgroup, yang dengan tampilan daur ulang tidak sama dengan jumlah item di adaptor. Namun, karena ListView diturunkan dari AdapterView, Anda bisa menggunakangetCount()
langsung di ListView.Cara saya melakukannya:
sumber
Sesuatu yang mempengaruhi:
sumber
Ini berhasil untuk saya.
sumber
Ini bisa jadi
sumber
Sangat menyakitkan untuk berurusan dengan pengguliran, mendeteksi ketika selesai dan memang ada di bagian bawah daftar (bukan bagian bawah layar yang terlihat), dan memicu layanan saya hanya sekali, untuk mengambil data dari web. Namun itu berfungsi dengan baik sekarang. Kode tersebut adalah sebagai berikut untuk kepentingan siapa saja yang menghadapi situasi yang sama.
CATATAN: Saya harus memindahkan kode terkait adaptor saya ke onViewCreated daripada onCreate dan mendeteksi pengguliran terutama seperti ini:
Di sini RideListSimpleCursorAdapter.REACHED_THE_END adalah variabel tambahan di SimpleCustomAdapter saya yang disetel seperti ini:
Hanya jika kedua ketentuan ini bertemu, itu berarti saya memang ada di paling bawah daftar, dan layanan saya hanya akan berjalan sekali. Jika saya tidak menangkap REACHED_THE_END, bahkan menggulir ke belakang akan memicu layanan lagi, selama item terakhir terlihat.
sumber
canScrollVertically(int direction)
berfungsi untuk semua Tampilan, dan tampaknya melakukan apa yang Anda minta, dengan kode lebih sedikit daripada kebanyakan jawaban lainnya. Masukkan angka positif, dan jika hasilnya salah, Anda berada di bawah.yaitu:
if (!yourView.canScrollVertically(1)) { //you've reached bottom }
sumber
Untuk memperluas sedikit pada salah satu jawaban di atas, inilah yang harus saya lakukan untuk membuatnya berfungsi sepenuhnya. Tampaknya ada sekitar 6dp padding bawaan di dalam ListView, dan onScroll () dipanggil saat daftar kosong. Ini menangani kedua hal itu. Ini mungkin bisa sedikit dioptimalkan, tetapi ditulis lebih untuk kejelasan.
Catatan samping: Saya telah mencoba beberapa teknik konversi dp ke piksel yang berbeda, dan dp2px () ini adalah yang terbaik.
sumber
Saya belum bisa berkomentar karena saya belum punya cukup reputasi, tapi dalam jawaban @Ali Imran dan @Wroclai saya rasa ada yang kurang. Dengan potongan kode itu, setelah Anda memperbarui preLast, itu tidak akan pernah menjalankan Log lagi. Dalam masalah khusus saya, saya ingin menjalankan beberapa operasi setiap kali saya menggulir ke bawah, tetapi setelah preLast diperbarui ke LastItem, operasi itu tidak pernah dijalankan lagi.
}
Dengan "lain" itu Anda sekarang dapat mengeksekusi kode Anda (Log, dalam hal ini) setiap kali Anda menggulir ke bawah sekali lagi.
sumber
sumber
Agar daftar Anda dipanggil ketika daftar mencapai terakhir dan jika terjadi kesalahan, maka ini tidak akan memanggil endoflistview lagi . Kode ini akan membantu skenario ini juga.
di mana LIST_UP_THRESHOLD_VALUE dapat berupa nilai bilangan bulat apa pun (saya telah menggunakan 5) di mana daftar Anda digulir ke atas dan saat kembali ke akhir, ini akan memanggil kembali tampilan daftar akhir.
sumber
Saya menemukan cara yang sangat bagus untuk secara otomatis memuat kumpulan halaman berikutnya dengan cara yang tidak memerlukan Anda sendiri
ScrollView
(seperti jawaban yang diterima mensyaratkan).Di ParseQueryAdapter, ada metode yang disebut
getNextPageView
yang memungkinkan Anda menyediakan tampilan kustom Anda sendiri yang muncul di akhir daftar ketika ada lebih banyak data untuk dimuat sehingga hanya akan terpicu ketika Anda telah mencapai akhir dari kumpulan halaman Anda saat ini (ini adalah tampilan "muat lebih banyak .." secara default). Metode ini hanya dipanggil jika ada lebih banyak data untuk dimuat, jadi ini adalah tempat yang tepat untuk menelepon.loadNextPage();
Dengan cara ini adaptor melakukan semua kerja keras untuk Anda dalam menentukan kapan data baru harus dimuat dan tidak akan dipanggil sama sekali jika Anda memilikinya mencapai akhir kumpulan data.Kemudian di dalam aktivitas / fragmen Anda, Anda hanya perlu menyetel adaptor dan data baru akan otomatis diperbarui untuk Anda seperti sulap.
sumber
Untuk mendeteksi apakah item terakhir terlihat sepenuhnya , Anda dapat menambahkan kalkulasi sederhana pada tampilan item terakhir yang terlihat dengan
lastItem.getBottom()
.sumber
Aku pergi dengan:
sumber
Dalam metode
getView()
(dariBaseAdapter
kelas yang diturunkan) seseorang dapat memeriksa apakah posisi tampilan saat ini sama dengan daftar item diAdapter
. Jika demikian, berarti kita telah mencapai akhir / terbawah daftar:sumber
Saya menemukan cara yang lebih baik untuk mendeteksi scroll listview berakhir di bagian bawah, pertama-tama deteksi scoll end dengan
Implementasi onScrollListener ini untuk mendeteksi akhir dari scrolling di ListView
akhirnya menggabungkan jawaban Martijn
sumber
Terima kasih banyak untuk poster di stackoverflow! Saya menggabungkan beberapa ide dan membuat pendengar kelas untuk aktivitas dan fragmen (jadi kode ini lebih dapat digunakan kembali, membuat kode lebih cepat untuk ditulis dan lebih bersih).
Yang harus Anda lakukan ketika Anda mendapatkan kelas saya adalah mengimplementasikan antarmuka (dan tentu saja membuat metode untuk itu) yang dideklarasikan di kelas saya dan membuat objek dari kelas ini melewati argumen.
sumber
Anda perlu menambahkan sumber daya footer xml kosong ke listView dan mendeteksi apakah footer ini terlihat.
Kemudian dalam pendengar gulir listView, Anda melakukan ini
sumber
Jika Anda menyetel tag pada tampilan item terakhir listview, nanti Anda dapat mengambil tampilan dengan tag tersebut, jika tampilan tersebut nol, itu karena tampilan tersebut tidak dimuat lagi. Seperti ini:
lalu jika Anda perlu mengetahui apakah item terakhir dimuat
sumber
Janwilx72 benar, tetapi min sdk adalah 21, jadi saya membuat metode ini :
untuk ScrollOrientation:
Mungkin terlambat, hanya untuk yang terlambat。
sumber
Jika Anda menggunakan adaptor khusus dengan tampilan daftar Anda (kebanyakan orang melakukannya!) Solusi yang bagus diberikan di sini!
https://stackoverflow.com/a/55350409/1845404
Metode getView adaptor mendeteksi ketika daftar telah di-scroll ke item terakhir. Ini juga menambahkan koreksi untuk saat-saat yang jarang terjadi ketika beberapa posisi sebelumnya dipanggil bahkan setelah adaptor telah memberikan tampilan terakhir.
sumber
Saya melakukan itu dan bekerja untuk saya:
sumber
Ini akan menggulir daftar Anda ke bawah ke entri terakhir.
sumber