Bagaimana Anda mengatur spasi kolom dengan RecyclerView menggunakan GridLayoutManager? Mengatur margin / padding di dalam layout saya tidak berpengaruh.
251
Bagaimana Anda mengatur spasi kolom dengan RecyclerView menggunakan GridLayoutManager? Mengatur margin / padding di dalam layout saya tidak berpengaruh.
GridLayoutManager
dan overridinggenerateDefaultLayoutParams()
serta kerabat?Jawaban:
RecyclerViews mendukung konsep ItemDecoration : offset khusus dan menggambar di sekitar setiap elemen. Seperti yang terlihat dalam jawaban ini , Anda dapat menggunakan
Kemudian tambahkan melalui
sumber
RecyclerView
(dan penggunaanclipToPadding="false"
) Anda, maka Anda dapat merestrukturisasi hal-hal sedikit. Namun, jika Anda tidak melakukannya, Anda hanya akan memindahkan centang if menjadi yang terakhir (karena Anda masih menginginkan bantalan bawah pada item terakhir).GridLayoutManager
. Jawabannya tidak akan berfungsi pada tata letak multi-kolom / barisKode berikut berfungsi dengan baik, dan setiap kolom memiliki lebar yang sama:
Pemakaian
1. tidak ada tepi
2. dengan tepi
sumber
Berikut ini adalah solusi sederhana langkah-demi-langkah jika Anda ingin jarak yang sama di sekitar item dan ukuran item yang sama.
Dekor ItemOffsetDecoration
Penerapan
Dalam kode sumber Anda, tambahkan
ItemOffsetDecoration
keRecyclerView.
nilai offset Item Anda harus setengah ukuran dari nilai aktual yang ingin Anda tambahkan sebagai ruang antar item.Juga, tetapkan nilai offset item sebagai padding-nya
RecyclerView
, dan tentukanandroid:clipToPadding=false
.sumber
Coba ini. Ini akan menjaga jarak yang sama di sekitar. Bekerja dengan List, Grid, dan StaggeredGrid.
Diedit
Kode yang diperbarui harus menangani sebagian besar kasus sudut dengan bentang, orientasi, dll. Perhatikan bahwa jika menggunakan setSpanSizeLookup () dengan GridLayoutManager, pengaturan setSpanIndexCacheEnabled () disarankan untuk alasan kinerja.
Catatan, tampaknya dengan StaggeredGrid, tampaknya ada bug di mana indeks anak-anak menjadi aneh dan sulit dilacak sehingga kode di bawah ini mungkin tidak bekerja dengan baik dengan StaggeredGridLayoutManager.
Semoga ini bisa membantu.
sumber
Kode berikut akan menangani StaggeredGridLayoutManager, GridLayoutManager, dan LinearLayoutManager.
Lalu gunakan itu
sumber
SpaceItemDecoration
benar-benar menambah padding untuk orang tua (pandangan pendaur ulang).halfSpace
padding muncul (ke kanan) ketika saya belum mengatur padding ke orang tua dalam xmlBerikut adalah solusi yang tidak memerlukan "spanCount" (jumlah kolom) yang saya gunakan karena saya menggunakan GridAutofitLayoutManager (menghitung jumlah kolom sesuai dengan ukuran sel yang diperlukan)
(berhati-hatilah karena ini hanya akan berfungsi di GridLayoutManager )
Berikut adalah GridAutofitLayoutManager yang diminati:
Akhirnya:
sumber
layoutManager.getPosition(view)
setelah itu memeriksa apakah posisinya nol yang akan menjadi tajuk Anda .. juga, cara ini akan memungkinkan Anda untuk menambahkan tajuk lain di posisi apa pun yang Anda inginkan :)Hanya ada satu solusi mudah, yang dapat Anda ingat dan terapkan di mana pun dibutuhkan. Tidak ada bug, tidak ada perhitungan gila. Beri margin pada tata letak kartu / item dan masukkan ukuran yang sama dengan padding ke RecyclerView:
item_layout.xml
activity_layout.xml
MEMPERBARUI:
sumber
Jika Anda ingin MEMPERBAIKI ukuran
RecyclerView
item Anda di semua perangkat. Anda bisa melakukan inirecyclerview_item.xml
dimens.xml
Aktivitas
sumber
Jawaban yang dipilih hampir sempurna, tetapi tergantung pada ruang, lebar item bisa tidak sama. (Dalam kasus saya itu sangat penting). Jadi saya berakhir dengan kode ini yang menambah sedikit ruang, jadi semuanya memiliki lebar yang sama.
sumber
columnCount == 1 -> { outRect.left = space outRect.right = space }
Salinan @edwardaa memberikan kode dan saya membuatnya sempurna untuk mendukung RTL:
sumber
Jawaban di atas telah memperjelas cara untuk mengatur penanganan margin GridLayoutManager dan LinearLayoutManager.
Tetapi untuk StaggeredGridLayoutManager, jawaban Pirdad Sakhizada mengatakan: "Ini mungkin tidak bekerja dengan baik dengan StaggeredGridLayoutManager". Seharusnya masalah tentang IndexOfSpan.
Anda bisa mendapatkannya dengan cara ini:
sumber
Sedikit berbeda dari jawaban edwardaa, perbedaannya adalah bagaimana kolom ditentukan, karena dalam kasus seperti item dengan berbagai ketinggian, kolom tidak dapat ditentukan hanya dengan%
spanCount
sumber
sumber
Berikut ini modifikasi saya
SpacesItemDecoration
yang dapat mengambil numOfColums dan ruang yang sama di atas, bawah, kiri dan kanan .dan gunakan kode di bawah ini pada logika Anda.
sumber
Ada solusi yang sangat sederhana namun fleksibel untuk masalah ini dengan hanya menggunakan XML yang berfungsi pada setiap LayoutManager.
Asumsikan Anda menginginkan spasi X yang sama (misalnya 8dp).
Bungkus item CardView Anda di Layout lain
Berikan Layout luar padding X / 2 (4dp)
Jadikan latar belakang Tata Letak transparan
...
...
dan itu saja. Anda memiliki jarak X (8dp) yang sempurna.
sumber
Bagi mereka yang memiliki masalah dengan staggeredLayoutManager (seperti https://imgur.com/XVutH5u )
metode recyclerView:
terkadang mengembalikan -1 sebagai indeks sehingga kita mungkin menghadapi masalah pengaturan itemDecor. Solusi saya adalah mengganti metode ItemDecoration yang sudah usang:
sebagai ganti dari newbie:
seperti ini:
Tampaknya bekerja untuk saya sejauh ini :)
sumber
Jawaban untuk pertanyaan ini tampaknya lebih kompleks dari yang seharusnya. Inilah pendapat saya tentang ini.
Katakanlah Anda ingin spasi 1dp di antara item kisi. Lakukan hal berikut:
sumber
Ini akan bekerja
RecyclerView
dengan header juga.sumber
Jawaban yqritc bekerja dengan baik untuk saya. Saya menggunakan Kotlin, jadi di sini ada padanannya.
yang lainnya sama.
sumber
Untuk pengguna StaggeredGridLayoutManager , berhati-hatilah, banyak jawaban di sini termasuk yang paling banyak dipilih menghitung kolom item dengan kode di bawah ini:
yang mengasumsikan item 1/3/5 / .. selalu berada di sisi kiri dan item 2/4/6 / .. selalu berada di sisi kanan. Apakah asumsi ini selalu benar? Tidak.
Katakanlah item pertama Anda 100dp tinggi dan 2 hanya 50dp, tebak di mana letak item ke-3 Anda, kiri atau kanan?
sumber
Saat menggunakan CardView untuk anak-anak masalah dengan spasi di antara item dapat diselesaikan dengan mengatur aplikasi: cardUseCompatPadding menjadi true.
Untuk margin yang lebih besar memperbesar elevasi item. CardElevation bersifat opsional (gunakan nilai default).
sumber
Saya akhirnya melakukannya seperti itu untuk RecyclerView saya dengan GridLayoutManager dan HeaderView .
Dalam kode di bawah ini saya menetapkan ruang 4dp di antara setiap item (2dp di sekitar setiap item dan 2dp di sekitar keseluruhan recyclerview).
layout.xml
fragmen / aktivitas
SpaceItemDecoration.java
Utils.java
sumber
Untuk membuat solusi https://stackoverflow.com/a/29905000/1649371 (di atas) saya harus memodifikasi metode berikut (dan semua panggilan berikutnya)
sumber
Tautan ini berfungsi untuk saya dalam semua situasi Anda dapat mencoba ini.
sumber
Jika Anda memiliki sakelar sakelar yang beralih di antara daftar ke kisi, jangan lupa menelepon
recyclerView.removeItemDecoration()
sebelum mengatur hiasan Item baru. Jika tidak, maka perhitungan baru untuk spasi akan salah.Sesuatu seperti ini.
sumber
Jika Anda menggunakan Header dengan GridLayoutManager gunakan kode ini ditulis dalam kotlin untuk spasi antar grid:
Dan lulus
ItemDecoration
untukrecyclerview
sebagaisumber
terima kasih jawaban edwardaa https://stackoverflow.com/a/30701422/2227031
Poin lain yang perlu diperhatikan adalah:
jika jarak total dan jumlah itemWidth tidak sama dengan lebar layar, Anda juga perlu menyesuaikan itemWidth, misalnya, pada adaptor dengan metodeBindViewHolder
sumber
Versi Kotlin yang saya buat berdasarkan jawaban hebat dari edwardaa
sumber