Saya mencoba menyegarkan item tertentu di RecyclerView
.
Cerita: Setiap kali pengguna mengklik item, itu terlihat AlertDialog
. Pengguna dapat mengetik beberapa teks dengan mengklik tombol ok. Saya ingin menunjukkan teks ini di item ini dan menunjukkan tidak terlihat ImageView
- dinyatakan dalam XML dan adaptor ViewHolder
-
Saya menggunakan fungsi ini di AlertDialog
Tombol Positif untuk memperbarui item:
private void updateListItem(int position) {
View view = layoutManager.findViewByPosition(position);
ImageView medicineSelected = (ImageView) view.findViewById(R.id.medicine_selected);
medicineSelected.setVisibility(View.VISIBLE);
TextView orderQuantity = (TextView) view.findViewById(R.id.order_quantity);
orderQuantity.setVisibility(View.VISIBLE);
orderQuantity.setText(quantity + " packet added!");
medicinesArrayAdapter.notifyItemChanged(position);
}
Tetapi kode ini tidak hanya mengubah itemView pada posisi yang diteruskan, tetapi juga mengubah beberapa itemView lainnya!
Bagaimana cara mengubah itemView tertentu dengan benar dengan mengkliknya?
onBindViewHolder()
Perbarui satu item
notifyItemChanged(updateIndex)
Contoh
Ubah item "Domba" sehingga bertuliskan "Saya suka domba".
Jawaban lengkap saya dengan lebih banyak contoh ada di sini .
sumber
Tambahkan teks yang diubah ke daftar data model Anda
sumber
Saya pikir saya punya Ide tentang bagaimana menangani ini. Memperbarui sama dengan menghapus dan mengganti pada posisi yang tepat. Jadi saya pertama-tama menghapus item dari posisi itu menggunakan kode di bawah ini:
dan kemudian saya akan menambahkan item pada posisi tertentu seperti yang ditunjukkan di bawah ini:
Saya mencoba menerapkan ini sekarang. Saya akan memberi Anda umpan balik saat saya selesai!
sumber
Saya harus menyelesaikan masalah ini dengan menangkap posisi item yang perlu dimodifikasi dan kemudian di panggilan adaptor
, ini akan memanggil onBindViewHolder (pemegang ViewHolder, posisi int) untuk item khusus ini di posisi khusus ini.
sumber
Solusi di bawah ini berhasil untuk saya:
Pada item RecyclerView, pengguna akan mengklik tombol tetapi tampilan lain seperti TextView akan diperbarui tanpa langsung memberi tahu adaptor:
Saya menemukan solusi yang baik untuk ini tanpa menggunakan metode notifyDataSetChanged (), metode ini memuat ulang semua data recyclerView jadi jika Anda memiliki gambar atau video di dalam item maka mereka akan memuat ulang dan pengalaman pengguna tidak akan baik:
Berikut adalah contoh klik pada ikon mirip ImageView dan hanya memperbarui satu TextView (Mungkin untuk memperbarui lebih banyak tampilan dengan cara yang sama dari item yang sama) untuk menunjukkan seperti pembaruan hitungan setelah menambahkan +1:
sumber
Sebuah cara yang berhasil untuk saya pribadi, menggunakan metode adaptor recyclerview untuk menangani perubahan pada itemnya.
Ini akan berjalan dengan cara yang mirip dengan ini, buat metode dalam tampilan pendaur ulang kustom Anda seperti ini:
sumber
Di kelas adaptor Anda, dalam metode onBindViewHolder, setel ViewHolder ke setIsRecyclable (false) seperti pada kode di bawah ini.
sumber
Anda hanya perlu menambahkan kode berikut di kotak dialog peringatan saat klik simpan
sumber
Masalahnya adalah
RecyclerView.Adatper
tidak menyediakan metode apa pun yang mengembalikan indeks elemenSolusi saya adalah membuat contoh peta untuk (elemen, posisi) s
Friend
) harus diimplementasikanhashCode()
danequals()
karena itu adalah kunci dalam hashmap.ketika sebuah elemen berubah,
Ini bagus untuk mendefinisikan metode pembantu
Contoh peta (
Map<Friend, Integer> posMap
) tidak selalu diperlukan. Jika map tidak digunakan, perulangan di seluruh daftar dapat menemukan posisi sebuah elemen.sumber
Itu juga masalah terakhir saya. Di sini solusi saya, saya menggunakan Model data dan adaptor untuk RecyclerView saya
sumber
jika Anda membuat satu objek dan menambahkannya ke daftar yang Anda gunakan di adaptor Anda, ketika Anda mengubah satu elemen daftar Anda di adaptor semua item Anda yang lain juga berubah dengan kata lain semua tentang referensi dan daftar Anda tidak pegang salinan terpisah dari objek tunggal itu.
sumber
Dalam adaptor RecyclerView, Anda harus memiliki ArrayList dan juga satu metode
addItemsToList(items)
untuk menambahkan item daftar ke ArrayList. Kemudian Anda dapat menambahkan item daftar dengan memanggiladapter.addItemsToList(items)
secara dinamis. Setelah semua item daftar Anda ditambahkan ke ArrayList maka Anda dapat memanggiladapter.notifyDataSetChanged()
untuk menampilkan daftar Anda.Anda bisa menggunakan
notifyDataSetChanged
di adaptor untuk RecyclerViewsumber