Saya memiliki RecyclerView dengan kotak teks TextView dan tombol silang ImageView. Saya memiliki tombol di luar recyclerview yang membuat tombol silang ImageView terlihat / hilang.
Saya mencari untuk menghapus item dari recylerview, ketika tombol item lintas itu ImageView ditekan.
Adaptor saya:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener {
private ArrayList<String> mDataset;
private static Context sContext;
public MyAdapter(Context context, ArrayList<String> myDataset) {
mDataset = myDataset;
sContext = context;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, parent, false);
ViewHolder holder = new ViewHolder(v);
holder.mNameTextView.setOnClickListener(MyAdapter.this);
holder.mNameTextView.setOnLongClickListener(MyAdapter.this);
holder.mNameTextView.setTag(holder);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mNameTextView.setText(mDataset.get(position));
}
@Override
public int getItemCount() {
return mDataset.size();
}
@Override
public void onClick(View view) {
ViewHolder holder = (ViewHolder) view.getTag();
if (view.getId() == holder.mNameTextView.getId()) {
Toast.makeText(sContext, holder.mNameTextView.getText(), Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onLongClick(View view) {
ViewHolder holder = (ViewHolder) view.getTag();
if (view.getId() == holder.mNameTextView.getId()) {
mDataset.remove(holder.getPosition());
notifyDataSetChanged();
Toast.makeText(sContext, "Item " + holder.mNameTextView.getText() + " has been removed from list",
Toast.LENGTH_SHORT).show();
}
return false;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mNumberRowTextView;
public TextView mNameTextView;
public ViewHolder(View v) {
super(v);
mNameTextView = (TextView) v.findViewById(R.id.nameTextView);
}
}
}
Layout saya adalah:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:id="@+id/layout">
<TextView
android:id="@+id/nameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:padding="5dp"
android:background="@drawable/greyline"/>
<ImageView
android:id="@+id/crossButton"
android:layout_width="16dp"
android:layout_height="16dp"
android:visibility="gone"
android:layout_marginLeft="50dp"
android:src="@drawable/cross" />
</LinearLayout>
Bagaimana saya bisa mendapatkan sesuatu seperti onClick yang berfungsi untuk ImageView crossButton saya? Apakah ada cara yang lebih baik? Mungkin mengubah seluruh item di klik menjadi menghapus item? Recyclerview menunjukkan daftar lokasi yang perlu diedit. Setiap saran teknis atau komentar / saran tentang implementasi terbaik akan sangat dihargai.
java
android
user-interface
android-recyclerview
selection
Dua puluh satu ratus
sumber
sumber
Jawaban:
Saya telah melakukan hal serupa. Di Anda
MyAdapter
:Semoga ini membantu.
Edit:
getPosition()
sudah ditinggalkan sekarang, gunakangetAdapterPosition()
saja.sumber
notifyItemRangeChanged(getPosition, mDataSet.size());
jawaban paraditet setelah Anda menghapus item sehingga semua tampilan di bawah item yang dihapus akan menyesuaikan sesuai.getPosition()
sekarang sudah tidak digunakan laginotifyItemRemoved(position)
tidak cukup.pertama-tama, item harus dihapus dari daftar!
kemudian:
sumber
jika masih item tidak dihapus gunakan metode ajaib ini :)
Versi Kotlin
sumber
Masalah
RecyclerView
secara default tidak mengetahui perubahan dataset Anda. Ini berarti bahwa setiap kali Anda membuat penghapusan / penambahan pada daftar data Anda, perubahan itu tidak akan langsung tercermin ke RecyclerView Anda.Larutan
RecyclerView menawarkan beberapa metode untuk membagikan keadaan dataset Anda. Ini terjadi karena modifikasi pada dataset Anda tidak menyiratkan perubahan tampilan, dan sebaliknya. API Android standar memungkinkan Anda untuk mengikat proses penghapusan data (untuk tujuan pertanyaan) dengan proses penghapusan tampilan.
Pendekatan Terbaik
Jika Anda tidak menentukan dengan tepat apa yang terjadi pada penambahan / penghapusan item Anda (berbicara tentang tampilan), anak-anak RecyclerView dianimasikan secara tidak responsif karena kurangnya informasi tentang cara memindahkan berbagai tampilan di sekitar daftar.
Sebagai gantinya, kode berikut justru akan memutar animasi, hanya pada anak yang sedang dihapus (Dan sebagai catatan, bagi saya itu memperbaiki apa pun
IndexOutOfBoundException
, ditandai oleh stacktrace sebagai "inkonsistensi data")Di bawah tenda, jika kita melihat ke dalam
RecyclerView
kita dapat menemukan dokumentasi yang menjelaskan bahwa parameter kedua yang harus kita lewati adalah jumlah item yang dihapus dari dataset, bukan jumlah total item (Seperti yang dinyatakan secara salah dalam beberapa sumber informasi lainnya).sumber
Mungkin jawaban rangkap tapi cukup berguna bagi saya. Anda dapat menerapkan metode yang diberikan di bawah ini
RecyclerView.Adapter<RecyclerView.ViewHolder>
dan dapat menggunakan metode ini sesuai kebutuhan Anda, saya harap ini akan berhasil untuk Andasumber
Berikut adalah beberapa contoh tambahan visual. Lihat jawaban lengkap saya untuk contoh menambah dan menghapus rentang.
Tambahkan satu item
Tambahkan "Babi" di indeks
2
.Hapus satu item
Hapus "Babi" dari daftar.
sumber
Saya mencoba semua jawaban di atas, tetapi memasukkan atau menghapus item ke recyclerview menyebabkan masalah dengan posisi di set data. Akhirnya menggunakan
delete(getAdapterPosition());
di dalam viewHolder yang bekerja sangat baik dalam menemukan posisi item.sumber
Masalah yang saya miliki adalah saya menghapus item dari daftar yang tidak lagi dikaitkan dengan adaptor untuk memastikan Anda memodifikasi adaptor yang benar Anda dapat menerapkan metode seperti ini di adaptor Anda:
Dan menyebutnya dalam fragmen atau aktivitas Anda seperti ini:
sumber
Saya harap ini membantu Anda.
sumber
jika Anda ingin menghapus item Anda harus melakukan ini: pertama hapus item:
pada langkah selanjutnya Anda harus memberi tahu adaptor pendaur ulang bahwa Anda menghapus item dengan kode ini:
tetapi jika Anda mengubah item, lakukan ini: pertama-tama ubah parameter objek Anda seperti ini:
atau baru seperti ini:
kemudian beri tahu adaptor pendaur ulang bahwa Anda memodifikasi item dengan kode ini:
semoga membantu anda.
sumber
sumber
notifyItemRemoved(position)
.Untuk Metode
onBindViewHolder
Tulis Kode Inisumber
Jika Anda ingin menerapkan sesuatu seperti ini di kelas Utama alih-alih kelas Adaptor, Anda dapat menggunakan:
di mana friendsListRecycler adalah nama Adaptor
sumber
sumber
membuat antarmuka menjadi kelas adaptor khusus dan menangani acara klik pada tampilan pendaur ulang ..
setelah mendefinisikan adaptor dan mengikat ke tampilan pendaur ulang yang disebut kode di bawah ini ..
sumber
Jika Anda bertanya-tanya seperti yang saya lakukan di mana kita bisa mendapatkan posisi adaptor dalam metode getadapterposition (); itu di viewholder object.so Anda harus meletakkan kode Anda seperti ini
sumber
sumber