Saya ingin menggulir ke bagian bawah daftar RecyclerView setelah memuat aktivitas.
GENERIC_MESSAGE_LIST = (ArrayList) intent.getExtras().getParcelableArrayList(ConversationsAdapter.EXTRA_MESSAGE);
conversationView = (RecyclerView) findViewById(R.id.list_messages);
conversationView.setHasFixedSize(true);
conversationViewLayoutManager = new LinearLayoutManager(this);
conversationView.setLayoutManager(conversationViewLayoutManager);
conversationViewAdapter = new ConversationAdapter(GENERIC_MESSAGE_LIST, this);
conversationView.setAdapter(conversationViewAdapter);
conversationView.scrollTo(...)
melempar pengecualian tentang tidak didukung di RecyclerView, dan conversationView.scrollToPosition(...)
sepertinya tidak melakukan apa-apa.
Setelah blok kode di atas, saya menambahkan
conversationView.scrollToPosition(GENERIC_MESSAGE_LIST.size() + 1)
yang tidak bekerja Ada 30 elemen dalam GENERIC_MESSAGE_LIST
.
java
android
scroll
android-recyclerview
waylaidwanderer
sumber
sumber
scrollToPosition
segera setelah mengatur adaptor?conversationView.setAdapter(conversationViewAdapter);
.Jawaban:
Cukup atur
setStackFromEnd=true
atausetReverseLayout=true
jadi LLM akan menata item dari ujung.Perbedaan antara keduanya adalah bahwa
setStackFromEnd
akan mengatur tampilan untuk menunjukkan elemen terakhir, arah tata letak akan tetap sama. (Jadi, dalam Tampilan Recycler horizontal kiri-ke-kanan, elemen terakhir akan ditampilkan dan menggulir ke kiri akan menampilkan elemen sebelumnya)Sedangkan
setReverseLayout
akan mengubah urutan elemen yang ditambahkan oleh Adaptor. Tata letak akan dimulai dari elemen terakhir, yang akan menjadi paling kiri di LTR Recycler View dan kemudian, gulir ke kanan akan menampilkan elemen sebelumnya.Sampel:
Lihat dokumentasi untuk detailnya.
sumber
Saya melihat posting ini untuk menemukan jawabannya tetapi ... Saya pikir semua orang di posting ini menghadapi skenario yang sama dengan saya:
scrollToPosition()
sepenuhnya diabaikan, karena alasan yang jelas.Apa yang saya gunakan?
... apa yang BEKERJA ?
sumber
recyclerView.scrollToPosition(messages.size()-1);
benar-benar bekerja untuk saya, saya hanya ingin tahu alasannya.smoothScrollToPosition(...)
.Saya tahu sudah terlambat untuk menjawab di sini, masih ada yang mau tahu solusinya ada di bawah ini
sumber
conversationView.smoothScrollToPosition(conversationView.getAdapter().getItemCount() **-1**);
sebagai posisi dalam daftar berbasis nol.Untuk scrolldown dari posisi apa pun di recyclerview ke bawah
sumber
Tambahkan kode ini setelah mengirim pesan dan sebelum menerima pesan dari server
sumber
Saat Anda menelepon
setAdapter
, itu tidak langsung menampilkan dan memposisikan item di layar (yang memerlukan satu tata letak lulus) makascrollToPosition()
panggilan Anda tidak memiliki elemen aktual untuk menggulir ke saat Anda memanggilnya.Sebagai gantinya, Anda harus mendaftarkan ViewTreeObserver.OnGlobalLayoutListener (via addOnGlobalLayoutListner () dari yang
ViewTreeObserver
dibuat olehconversationView.getViewTreeObserver()
) yang menunda AndascrollToPosition()
hingga setelah tata letak pertama berlalu:sumber
OnGlobalLayoutListener
mungkin tidak dihapus karena Anda memeriksavto.isAlive()
. Saya tidak tahu alasannya, tetapiViewTreeObserver
kadang-kadang diubah untuk aView
, jadi alih-alih memeriksaisAlive
Anda lebih baik, dapatkan sajaViewTreeObserver
denganconversationView.getViewTreeObserver().removeGlobalOnLayoutListener
Solusi untuk Kotlin :
terapkan kode di bawah ini setelah menetapkan "recyclerView.adapter" atau setelah "recyclerView.adapter.notifyDataSetChanged ()"
sumber
Di Kotlin:
sumber
GlobalLayoutListener
! Setelah refactoring saya harus menggunakan metode Anda untuk menggulir. Jangan lupa untuk menghapus pendengar seperti di stackoverflow.com/questions/28264139/… , atau Anda tidak akan menggulir RecyclerView kembali ke awal.dan
kode di atas berfungsi, tetapi tidak mulus dan tidak keren.
sumber
JIKA Anda memiliki adaptor yang terpasang dengan recyclerView maka lakukan saja ini.
mRecyclerView.smoothScrollToPosition(mRecyclerView.getAdapter().getItemCount());
sumber
Jawaban roc sangat membantu. Saya ingin menambahkan blok kecil ke sana:
sumber
Dalam kasus saya di mana tampilan tidak memiliki ketinggian yang sama, memanggil scrollToPosition pada LayoutManager berfungsi untuk benar-benar menggulir ke bawah dan melihat sepenuhnya item terakhir:
sumber
Ini berfungsi dengan baik bagi saya:
sumber
Gulir pertama kali saat masuk dalam tampilan pendaur ulang pertama kali kemudian gunakan
masukkan minus untuk gulir ke bawah untuk gulir ke atas, masukkan nilai positif);
jika tampilan sangat tinggi maka scrolltoposition offset tertentu digunakan untuk bagian atas tampilan maka Anda gunakan
sumber
Hanya jawaban Ian yang dapat membuat
RecyclerView
gulungan saya ke posisi yang ditentukan. Namun, TheRecyclerView
tidak dapat menggulir setelah itu ketika saya menggunakanscrollToPosition()
.smoothScrollToPosition()
berfungsi tetapi animasi awal membuatnya terlalu lambat ketika daftar panjang. Alasannya adalah pendengarnya tidak dihapus. Saya menggunakan kode di bawah ini untuk menghapus arusViewTreeObserver
dan itu berfungsi sebagai pesona.sumber
kode ini akan memberi Anda posting terbaru terlebih dahulu, saya pikir jawaban ini sangat membantu.
sumber
Mencoba metode @galex , itu berhasil hingga refactoring. Jadi saya menggunakan jawaban @ yanchenko dan berubah sedikit. Mungkin ini karena saya menelepon gulir dari
onCreateView()
, tempat tampilan fragmen dibuat (dan mungkin tidak memiliki ukuran yang tepat).Anda juga dapat menambahkan tanda centang
viewTreeObserver.isAlive
di https://stackoverflow.com/a/39001731/2914140 .sumber
Jika tidak ada yang berhasil,
Anda harus mencoba menggunakan:
Dengan melakukan ini, Anda meminta ConstraintLayout tertentu (Atau apa pun yang Anda miliki) untuk ditampilkan. Gulir itu instan.
Saya bekerja bahkan dengan keyboard yang ditampilkan.
sumber