Saat ini tidak ada implementasi standar RecyclerView.Adapter tersedia.
Mungkin dengan rilis resmi, Google akan menambahkannya.
Karena tidak ada dukungan untuk CursorAdapter
dengan RecyclerView
saat ini, bagaimana kita bisa menggunakan RecyclerView
dengan database? Ada saran?
android
simplecursoradapter
android-recyclerview
Anak anjing hilang
sumber
sumber
setHasStableIds(true)
Solusi saya adalah menahan anggota CursorAdapter di implementasi recyclerView.Adapter saya. Kemudian melewati semua penanganan menciptakan tampilan baru & mengikatnya ke adaptor kursor, sesuatu seperti ini:
sumber
public void changeCursor(Cursor cursor){ mCursorAdapter.changeCursor(cursor); notifyDataSetChanged(); }
Karena pertanyaan Anda mengatakan "Bagaimana cara menggunakan
RecyclerView
dengan database" dan Anda tidak spesifik apakah Anda ingin SQLite atau yang lainnyaRecyclerView
, saya akan memberikan solusi yang sangat optimal. Saya akan menggunakan Realm sebagai basis data dan membiarkan Anda menampilkan semua data di dalamRecyclerView
. Ini memiliki dukungan permintaan asinkron juga tanpa menggunakanLoaders
atauAsyncTask
.Mengapa dunia?
Langkah 1
Tambahkan dependensi gradle untuk Realm, ketergantungan untuk versi terbaru dapat ditemukan di sini
Langkah 2
Buat kelas model Anda, misalnya, katakanlah sesuatu yang sederhana seperti
Data
yang memiliki 2 bidang, string yang akan ditampilkan di dalamRecyclerView
baris dan cap waktu yang akan digunakan sebagai itemId untuk memungkinkanRecyclerView
item bernyawa. Perhatikan bahwa saya memperluas diRealmObject
bawah ini karenaData
kelas Anda akan disimpan sebagai tabel dan semua properti Anda akan disimpan sebagai kolom dari tabel ituData
. Saya telah menandai teks data sebagai kunci utama dalam kasus saya karena saya tidak ingin string ditambahkan lebih dari sekali. Tetapi jika Anda lebih suka memiliki duplikat, maka jadikan timestamp sebagai @PrimaryKey. Anda bisa memiliki tabel tanpa kunci utama tetapi itu akan menyebabkan masalah jika Anda mencoba memperbarui baris setelah membuatnya. Kunci primer gabungan pada saat penulisan jawaban ini tidak didukung oleh Realm.Langkah 3
Buat tata letak Anda untuk bagaimana satu baris seharusnya muncul di dalam
RecyclerView
. Tata letak untuk item baris tunggal di dalam kamiAdapter
adalah sebagai berikutPerhatikan bahwa saya telah menyimpan
FrameLayout
root meskipun saya punyaTextView
di dalam. Saya berencana untuk menambahkan lebih banyak item dalam tata letak ini dan karenanya membuatnya fleksibel untuk saat ini :)Untuk orang-orang yang penasaran di luar sana, ini adalah bagaimana satu item terlihat saat ini.
Langkah 4
Buat
RecyclerView.Adapter
implementasi Anda . Dalam hal ini, objek sumber data adalah objek khusus yang disebutRealmResults
yang pada dasarnya adalah LIVEArrayList
, dengan kata lain, karena item ditambahkan atau dihapus dari tabel Anda,RealmResults
objek ini diperbarui secara otomatis.Perhatikan bahwa saya menelepon
notifyItemRemoved
dengan posisi di mana penghapusan terjadi tetapi saya TIDAK meneleponnotifyItemInserted
ataunotifyItemRangeChanged
karena tidak ada cara langsung untuk mengetahui posisi mana item yang dimasukkan ke dalam basis data karena entri Realm tidak disimpan dengan cara yang dipesan. TheRealmResults
objek auto update setiap kali item baru ditambahkan, dimodifikasi atau dihapus dari database sehingga kita sebutnotifyDataSetChanged
sambil menambahkan dan memasukkan entri massal. Pada titik ini, Anda mungkin khawatir tentang animasi yang tidak akan dipicu karena Anda meneleponnotifyDataSetChanged
di tempatnotifyXXX
metode. Itulah sebabnya saya memilikigetItemId
metode mengembalikan timestamp untuk setiap baris dari objek hasil. Animasi dicapai dalam 2 langkah dengannotifyDataSetChanged
jika Anda memanggilsetHasStableIds(true)
dan kemudian menimpanyagetItemId
untuk memberikan sesuatu selain dari posisi.Langkah 5
Mari kita tambahkan
RecyclerView
keActivity
atauFragment
. Dalam kasus saya, saya menggunakanActivity
. File layout yang berisiRecyclerView
sangat sepele dan akan terlihat seperti ini.Saya telah menambahkan
app:layout_behavior
sejak sayaRecyclerView
masuk ke dalamCoordinatorLayout
yang saya belum diposting di jawaban ini untuk singkatnya.Langkah 6
Bangun
RecyclerView
kode in dan berikan data yang dibutuhkan. Buat dan inisialisasi objek Realm di dalamnyaonCreate
dan tutup di dalamnyaonDestroy
seperti menutupSQLiteOpenHelper
instance. Paling sederhanaonCreate
di dalam AndaActivity
akan terlihat seperti ini. TheinitUi
metode adalah di mana semua keajaiban terjadi. Saya membuka contoh Realm di dalamonCreate
.Perhatikan bahwa pada langkah pertama, saya meminta Realm untuk memberi saya semua objek dari
Data
kelas yang diurutkan berdasarkan nama variabel mereka yang disebut data secara asinkron. Ini memberi sayaRealmResults
objek dengan 0 item pada utas utama yang saya atur diAdapter
. Saya menambahkanRealmChangeListener
untuk diberitahu ketika data telah selesai memuat dari utas latar tempat saya meneleponnotifyDataSetChanged
dengan sayaAdapter
. Saya juga telah memanggilsetHasStableIds
true untuk membiarkanRecyclerView.Adapter
implementasi melacak item yang ditambahkan, dihapus atau dimodifikasi. UntukonDestroy
sayaActivity
menutup instance RealmMetode ini
initUi
dapat disebut dalamonCreate
dari AndaActivity
atauonCreateView
atauonViewCreated
dari AndaFragment
. Perhatikan hal-hal berikut.Langkah 7
BAM! Ada data dari database dalam Anda
RecyclerView
asynchonously dimuat tanpaCursorLoader
,CursorAdapter
,SQLiteOpenHelper
dengan animasi. Gambar GIF yang ditampilkan di sini agak lamban tetapi animasinya terjadi ketika Anda menambahkan item atau menghapusnya.sumber
Anda dapat menerapkan semua metode yang diperlukan sendiri. Baru-baru ini saya membuat implementasi sendiri dengan hanya menyalin kode tempel dari CursorAdapter.
sumber
Saya membuat RecyclerViewCursorAdapter menggunakan SortedList sebagai backend, memperluas RecyclerView.Adapter
Dapat digunakan dengan SQLiteCursor dan Loader
sumber
Hanya jawaban lain, karena saya tidak suka yang diterima (yang juga tidak memiliki penggunaan intuitif).
Berikut ini adalah implementasi saya sendiri, yang sangat mirip dengan (dan sebagian terinspirasi oleh)
SimpleCursorAdapter
:Anda dapat memodifikasinya untuk penggunaan khusus lainnya, tetapi memiliki kursor berfungsi seperti
SimpleCursorAdapter
halnya hanya dengan aRecyclerView
.sumber
Setelah mengambil data dari DB dan menyimpan dalam daftar, mungkin itu harus seperti ini:
tambahkan data ke recyclerview
sumber
Di bawah ini adalah implementasi cursoradapter saya untuk recyclerview. Ini mendukung OnItemClickListener, OnLongItemClickListener, OnfooterClickListener, Bagian, dan catatan kaki. Tidak mendukung , Header, onHeaderClickListner, penggulung cepat, header lengket, atau bagian lengket.
Cukup rentangkan adaptor ini dan buat adaptor Anda sendiri. Ganti metode yang disediakan. dan meneruskan kursor dari metode OnCursorLoadFinished.Jika adaptor sudah dibuat kemudian swapCursor ()
sumber
Implementasi yang paling sederhana adalah dengan menggunakan objek kursor di adaptor dan meneruskan kursor ke konstruktor viewholder untuk mengubah tampilan dan mengubah posisi kursor di onBindViewholder.
Jika Anda menggunakan Loader kursor, panggil metode setCursor masuk
onLoadfinished()
dan meneruskan null inonLoadReset()
}
sumber
Akhirnya kami memiliki implementasi RecyclerView.Adapter untuk database / jaringan.
Itu diwujudkan dengan Komponen Arsitektur Android :
Basis data kamar: Lapisan basis data di atas basis data SQLite yang menangani tugas-tugas biasa yang Anda gunakan untuk menangani
SQLiteOpenHelper
. Pemegang basis data yang berfungsi sebagai titik akses ke basis data SQLite yang mendasarinya. Database Kamar menggunakan DAO untuk mengeluarkan pertanyaan ke database SQLite.ViewModel: Menyediakan data ke UI. Bertindak sebagai pusat komunikasi antara Repositori dan UI. Menyembunyikan tempat data berasal dari UI. Contoh ViewModel selamat dari Kegiatan / Penggalan rekreasi.
LiveData: Kelas pemegang data yang dapat diamati. Selalu memegang / menyimpan data versi terbaru. Memberitahu pengamatnya ketika data telah berubah. LiveData sadar akan siklus hidup. Komponen UI hanya mengamati data yang relevan dan jangan berhenti atau melanjutkan pengamatan. LiveData secara otomatis mengelola semua ini karena menyadari perubahan status siklus hidup yang relevan saat mengamati.
sumber
Anda dapat menggunakan database SQLite untuk menyimpan detailnya. Sangat mudah untuk mengakses data. Anda dapat memeriksa kode saya di github. https://github.com/thiru-wta/ToDo
Metode basis data:
dapatkan metode:
sumber
Anda cukup mengikuti langkah-langkah ini:
view.adapter
, buat ArrayList atau Iterator diinisialisasi dengan nilai nol.swapdata(Arraylist<T> data)
. Di dalam Anda memberikan nilai-nilai baru ke daftar array, iterator atau struktur apa saja yang dapat diulang-ulang menggunakan posisi integer di dalam bindview. Nilai-nilai metode ini diteruskan dalamonloaderfinished()
. Kemudian teleponlah tepat setelah penugasannotifydatachange()
; ini akan memintaRecyclerView
untuk menggambar kembali semua daftar dengan data baru dari ArrayList.Dalam aktivitas atau fragmen di mana Anda menggunakan loadercalback, buat metode yang mengubah kursor ke daftar array, atau iterator, tergantung pada struktur data yang dipilih dalam adaptor.
Dengan cara ini Anda selalu dapat menggunakan loadercalback tanpa memblokir utas utama.
sumber