Di RecyclerView, saya bisa tiba-tiba menggulir ke atas item yang dipilih dengan menggunakan:
((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(position, 0);
Namun, ini tiba-tiba memindahkan item ke posisi teratas. Saya ingin pindah ke atas item dengan lancar .
Saya juga mencoba:
recyclerView.smoothScrollToPosition(position);
tetapi tidak berfungsi dengan baik karena tidak memindahkan item ke posisi yang dipilih ke atas. Ini hanya menggulung daftar sampai item pada posisi terlihat.
protected int getHorizontalSnapPreference() { return LinearSmoothScroller.SNAP_TO_START; }
. Selanjutnya saya harus menerapkan metode abstrakpublic PointF computeScrollVectorForPosition(int targetPosition) { return layoutManager.computeScrollVectorForPosition(targetPosition); }
.untuk ini, Anda harus membuat LayoutManager kustom
gunakan ini untuk RecyclerView Anda dan panggil smoothScrollToPosition.
contoh:
ini akan menggulir ke atas item RecyclerView dari posisi yang ditentukan.
semoga ini membantu.
sumber
smoothScrollToPosition
. Mengapa masalah ini bisa terjadi? Terima kasih.Ini adalah fungsi ekstensi yang saya tulis di Kotlin untuk digunakan dengan
RecyclerView
(berdasarkan jawaban @Paul Woitaschek):Gunakan seperti ini:
sumber
Kita bisa coba seperti ini
sumber
Ganti fungsi countDyToMakeVisible / countDxToMakeVisible di LinearSmoothScroller untuk mengimplementasikan posisi offset Y / X
sumber
Cara termudah yang saya temukan untuk menggulir a
RecyclerView
adalah sebagai berikut:sumber
Saya Digunakan Seperti Ini:
sumber
Terima kasih, @droidev untuk solusinya. Jika ada yang mencari solusi Kotlin, lihat ini:
sumber
CustomLinearLayout.kt:
Catatan: Contoh di atas diatur ke arah HORIZONTAL, Anda dapat melewati VERTICAL / HORIZONTAL selama inisialisasi.
Jika Anda menyetel arah ke VERTICAL, Anda harus mengubah " countDxToMakeVisible " menjadi " countDyToMakeVisible " (perhatikan juga nilai pengembalian panggilan supertipe)
Aktivitas / Fragment.kt :
sumber
Mungkin pendekatan @droidev adalah yang benar, tetapi saya hanya ingin mempublikasikan sesuatu yang sedikit berbeda, yang pada dasarnya melakukan pekerjaan yang sama dan tidak memerlukan ekstensi dari LayoutManager.
CATATAN di sini - ini akan berfungsi dengan baik jika item Anda (yang ingin Anda gulir di bagian atas daftar) terlihat di layar dan Anda hanya ingin menggulirnya ke atas secara otomatis. Ini berguna ketika item terakhir dalam daftar Anda memiliki beberapa tindakan, yang menambahkan item baru dalam daftar yang sama dan Anda ingin memfokuskan pengguna pada item baru yang ditambahkan:
Idenya sederhana: 1. Kita perlu mendapatkan koordinat teratas dari elemen recyclerview; 2. Kita perlu mendapatkan koordinat teratas dari item tampilan yang ingin kita gulir ke atas; 3. Di akhir dengan perhitungan offset yang perlu kita lakukan
200 hanyalah contoh nilai integer kode keras yang dapat Anda gunakan jika item viewholder tidak ada, karena itu juga mungkin.
sumber
Saya ingin membahas lebih lengkap masalah durasi gulir , yang, jika Anda memilih jawaban sebelumnya, sebenarnya akan bervariasi secara dramatis (dan tidak dapat diterima) sesuai dengan jumlah pengguliran yang diperlukan untuk mencapai posisi target dari posisi saat ini.
Untuk mendapatkan durasi gulir yang seragam, kecepatan (piksel per milidetik) harus memperhitungkan ukuran masing-masing item - dan bila item tersebut berdimensi non-standar maka tingkat kompleksitas yang sama sekali baru ditambahkan.
Ini mungkin alasan mengapa pengembang RecyclerView menggunakan keranjang yang terlalu keras untuk aspek vital pengguliran yang mulus ini.
Dengan asumsi Anda menginginkan durasi scroll semi-seragam , dan daftar Anda berisi item semi-seragam maka Anda memerlukan sesuatu seperti ini.
PS: Saya mengutuk pada hari saya mulai tanpa pandang bulu mengubah ListView ke RecyclerView .
sumber
Anda dapat membalikkan daftar Anda dengan
list.reverse()
dan akhirnya meneleponRecylerView.scrollToPosition(0)
sumber