Saya ingin memperluas / menciutkan item dari recyclerView saya untuk menampilkan lebih banyak info. Saya ingin mencapai efek yang sama dengan SlideExpandableListView .
Pada dasarnya di viewHolder saya, saya memiliki tampilan yang tidak terlihat dan saya ingin melakukan animasi yang diperluas / runtuh daripada mengatur visibilitas ke VISIBLE / GONE saja. Saya hanya perlu item untuk diperluas pada satu waktu dan itu akan keren untuk memiliki beberapa ketinggian untuk menunjukkan bahwa item tersebut dipilih.
Ini adalah efek yang sama dari daftar riwayat panggilan terakhir Android baru. Opsi "CALL BACK" dan "DETAILS" hanya terlihat ketika item dipilih.
Jawaban:
Tolong jangan gunakan perpustakaan apa pun untuk efek ini, sebaliknya gunakan cara yang disarankan untuk melakukannya sesuai dengan Google I / O. Dalam metode onBindViewHolder recyclerView Anda lakukan ini:
Dan untuk efek keren yang Anda inginkan, gunakan ini sebagai atribut list_item Anda:
di mana comment_background berada:
dan comment_selection adalah:
sumber
TransitionManager.beginDelayedTransition(recyclerView);
jika saya tidak dapat menyembunyikan referensi tampilan pendaur ulang.recyclerView
sebagai parameter dalam konstruktor untuk adaptorUntuk ini, hanya perlu garis-garis sederhana tidak rumit
dalam metode onBindViewHolder Anda tambahkan kode di bawah ini
Bagi mereka yang ingin hanya satu item yang diperluas dan yang lain akan runtuh. Gunakan ini
pertama mendeklarasikan variabel global dengan beforeExpandedPosition = -1
kemudian
Selesai !!!. Sederhana dan rendah hati .. :)
sumber
OnClickListener
keonCreateViewHolder
bukanonBindViewHolder
RecyclerView
melakukan pekerjaan, maksud saya, apa gunanyaLayoutManager
jika tidak mengelola tata letak! Solusi ini lebih baik daripada solusi pilihan teratas karena memiliki lebih sedikit kode, memungkinkanRecyclerView
menangani hal-hal dan bekerja lebih baik!Bukan mengatakan ini adalah pendekatan terbaik, tetapi tampaknya berhasil bagi saya.
Kode lengkap dapat ditemukan di: Kode contoh di: https://github.com/dbleicher/recyclerview-grid-quickreturn
Pertama, tambahkan area yang diperluas ke tata letak sel / item Anda, dan buat tata letak sel terlampir animateLayoutChanges = "true". Ini akan memastikan bahwa perluasan / keruntuhan dianimasikan:
Kemudian, buat kelas Adapter RV Anda mengimplementasikan View.OnClickListener sehingga Anda dapat bertindak pada item yang diklik. Tambahkan bidang int untuk menahan posisi tampilan yang diperluas, dan inisialisasi ke nilai negatif:
Terakhir, terapkan metode ViewHolder, onBindViewHolder () Anda dan ganti metode onClick (). Anda akan memperluas tampilan di onBindViewHolder jika posisinya sama dengan "ExpandPosition", dan menyembunyikannya jika tidak. Anda menetapkan nilai diperluasPosisi di pendengar onClick:
Ini harus diperluas hanya satu item setiap kali, menggunakan animasi sistem-default untuk perubahan tata letak. Setidaknya itu bekerja untuk saya. Semoga ini bisa membantu.
sumber
expandAlarm
fungsi dalamAlarmClockFragment.java
file mengeksekusi bagian ekspansi.onClick()
harus saya timpa? Tidak adaonClick
dalam Adaptor.Ada perpustakaan yang sangat mudah digunakan dengan dukungan gradle: https://github.com/cachapa/ExpandableLayout .
Langsung dari dokumen perpustakaan:
Setelah Anda menandai Anda diupgrade pandangan, sebut saja salah satu metode ini pada wadah:
expand()
,collapse()
atautoggle()
sumber
Saya tahu ini sudah lama sejak pertanyaan awal diposting. Tetapi saya pikir untuk yang lambat seperti saya sedikit penjelasan tentang jawaban @ Heisenberg akan membantu.
Deklarasikan dua variabel dalam kelas adaptor sebagai
Kemudian di onBindViewHolder berikut seperti yang diberikan dalam jawaban asli.
Dan terakhir untuk mendapatkan objek recyclerView dalam penggantian adaptor
Semoga ini membantu.
sumber
Tidak perlu menggunakan perpustakaan pihak ketiga. Sebuah tweak dalam metode ditunjukkan dalam Google I / O 2016 dan Heisenberg tentang topik ini, melakukan trik.
Karena
notifyDataSetChanged()
menggambar ulang yang lengkapRecyclerView
,notifyDataItemChanged()
adalah pilihan yang lebih baik (bukan yang terbaik) karena kita memiliki posisi dan kemampuan yangViewHolder
kita miliki, dannotifyDataItemChanged()
hanya menggambar ulang yang khususViewHolder
pada posisi tertentu .Tetapi masalahnya adalah bahwa hilangnya prematur
ViewHolder
pada mengklik dan kemunculannya tidak dihilangkan bahkan jikanotifyDataItemChanged()
digunakan.Kode berikut ini tidak menggunakan
notifyDataSetChanged()
ataunotifyDataItemChanged()
dan Diuji pada API 23 dan berfungsi seperti pesona ketika digunakan pada RecyclerView di mana setiap ViewHolder memilikiCardView
elemen root seperti itu:prev_position
adalah integer global yang diinisialisasi ke -1.details
adalah tampilan lengkap yang ditampilkan saat diperluas dan terselubung saat diciutkan.Seperti yang dikatakan, elemen root dari
ViewHolder
adalahCardView
denganforeground
danstateListAnimator
atribut didefinisikan persis seperti yang dikatakan oleh Heisenberg pada topik ini.UPDATE: Demonstrasi di atas akan runtuh item yang sudah diperluas sebelumnya jika salah satu dari mereka di diperluas. Untuk memodifikasi perilaku ini dan menjaga item yang diperluas seperti ketika item lain diperluas, Anda akan memerlukan kode berikut.
UPDATE: Ketika memperluas item terakhir dalam daftar, itu mungkin tidak dibawa ke visibilitas penuh karena bagian yang diperluas berada di bawah layar. Untuk mendapatkan item lengkap di layar gunakan kode berikut.
PENTING: Agar demonstrasi di atas berfungsi, seseorang harus menyimpan dalam kode mereka instance dari RecyclerView & itu LayoutManager (nanti untuk fleksibilitas)
sumber
notifyItemChanged
karena sayaImageView
memuat gambar dari url.notifyItemChanged
memuat ulang gambar saya membuatnya tampak anehTransitionManager.beginDelayedTransition(recycler);
, sangat bagus. Tetapi saya menemukan bahwa dengan menggunakan metode ini, jika saya mengklik-spam beberapa baris secara berurutan, pada akhirnya memicu crash internalThe specified child already has a parent. You must call removeView() on the child's parent first
. Saya membayangkan ini karena tampilan daur ulang pada batas tampilan pendaur ulang, tetapi saya tidak bisa memastikannya. Adakah yang memiliki masalah yang sama?Setelah menggunakan cara yang direkomendasikan melaksanakan diupgrade / item dilipat berada di
RecyclerView
atas RecyclerView memperluas / item runtuhnya dijawab oleh Heisenberg , saya telah melihat beberapa artefak terlihat setiap kaliRecyclerView
refresh dengan menerapkanTransitionManager.beginDelayedTransition(ViewGroup)
dan kemudiannotifyDatasetChanged()
.Jawaban aslinya:
Diubah:
int
yang melacak item yang diperluasViewHolder
digunakan selama barang runtuhnyaPerhatikan bahwa metode
TransitionManager.beginDelayedTransition(ViewGroup)
dannotifyDataSetChanged()
diganti dengannotifyItemChanged(int)
menargetkan item tertentu dan beberapa penyesuaian kecil.Setelah modifikasi, efek yang tidak diinginkan sebelumnya harus hilang. Namun, ini mungkin bukan solusi yang sempurna. Itu hanya melakukan apa yang saya inginkan, menghilangkan pemandangan.
:: EDIT ::
Untuk klarifikasi, baik
mExpandedPosition
danmExpandedHolder
yang GLOBALS.sumber
notifyItemChanged()
. Anda dapat menghidupkan dan mengubah ketinggian item secara manual dan menambahkan tampilan ke dalamnya.Lakukan hal berikut setelah Anda mengatur pendengar onClick ke kelas ViewHolder:
Saya pikir itu akan membantu, itulah cara saya menerapkan dan melakukan google yang sama tidak dalam tampilan panggilan terakhir.
sumber
Saya terkejut bahwa belum ada jawaban yang ringkas, meskipun animasi yang diperluas / runtuh sangat mudah dicapai hanya dengan 2 baris kode:
bersama dengan
Jadi bagi saya, penjelasan dalam tautan di bawah ini sangat bermanfaat: https://medium.com/@nikola.jakshic/how-to-expand-collapse-items-in-recyclerview-49a648a403a6
sumber
sumber
Gunakan dua jenis tampilan di layar Anda
RVAdapter
. Satu untuk tata letak diperluas dan lainnya untuk diciutkan. Dan keajaiban terjadi dengan pengaturanandroid:animateLayoutChanges="true"
untukRecyclerView
Checkout efek yang dicapai menggunakan ini pada 0:42 di video inisumber