Adakah yang menggunakan RecyclerView
menemukan cara untuk mengatur onClickListener
item ke dalam RecyclerView
? Saya berpikir untuk mengatur pendengar untuk setiap tata letak untuk setiap item tapi itu tampaknya sedikit terlalu merepotkan saya yakin ada cara bagi RecyclerView
untuk mendengarkan onClick
acara tersebut tetapi saya tidak bisa mengetahuinya.
java
android
android-recyclerview
onclick
onclicklistener
CurtJRees
sumber
sumber
Jawaban:
Karena API telah berubah secara radikal, itu tidak akan mengejutkan saya jika Anda membuat
OnClickListener
untuk setiap item. Itu tidak terlalu merepotkan. Dalam implementasiRecyclerView.Adapter<MyViewHolder>
Anda, Anda harus memiliki:The
onClick
Metode:sumber
onClick()
, milikOnClickListener
dapat dilampirkan ke ANY View. Seluruh pertanyaan di sini adalah yang mana! Tolong usahakan, metode tidak hanya diidentifikasi dengan nama, tetapi juga setidaknya oleh kelas. Jika Anda tidak mengatakan kode Anda akan ditambahkan ke adaptor, jawaban Anda tidak terlalu membantu.Berikut ini adalah lebih baik dan kurang cara ketat ditambah untuk menerapkan
OnClickListener
untukRecyclerView
.Cuplikan penggunaan:
RecyclerItemClickListener
penerapan:sumber
Saya melakukannya dengan cara ini, tanpa kelas yang tidak semestinya, detektor dll. Kode sederhana di dalam adaptor kami. Terutama solusi yang lebih baik untuk longClick daripada yang disajikan sebelumnya.
Kemudian di dalam fragmen atau aktivitas, tekan saja:
sumber
Lihat pertanyaan serupa @ tautan komentar CommonsWare untuk ini , yang mengimplementasikan
OnClickListener
antarmuka dalamviewHolder
.Berikut ini contoh sederhana dari
ViewHolder
:The
Adapter
kemudian terlihat seperti ini:sumber
ListView
sudah bermasalah jika Anda harus membuat daftar objek yang lebih rumit daripada hanya baris sederhana. Bagaimana jika Anda perlu menangani berbagai peristiwa tergantung di mana Anda mengklik item di ListView? Anda kacau. Di sini, Anda memiliki masing-masing pendengar.getPosition()
sudah usang, gunakangetAdapterPosition()
ataugetLayoutPosition()
sebagai gantinya.Berdasarkan jawaban Jacob Tabak (+1 untuknya), saya dapat menambahkan pendengar onLongClick:
Maka Anda dapat menggunakannya seperti ini:
sumber
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
view.getId() == R.id.selection
Inilah yang bekerja untuk saya. Lampirkan
OnClickListener
keonBindView
. Saya tidak benar-benar tahu apakah ini akan mempengaruhi kinerja, tetapi tampaknya berfungsi dengan baik dengan sedikit kode.sumber
Ini sangat sulit bagi saya untuk memiliki pendengar klik item dalam aktivitas dan juga memiliki pendengar klik untuk tampilan tunggal item yang tidak akan memicu pendengar klik item. Setelah bermain-main dengan jawaban Jacob Tabak, saya menghargai jawabannya pada klik item jika tidak ada tindakan sentuh lain di dalam item yang disajikan.
Saya memiliki
OnClickListener
antarmuka khusus yang memiliki aktivitas klik item yang menahan tampilan item yang diklik dan posisi item dari adaptor. Saya menyajikan contoh itu di konstruktor (atau bisa dengan setter) dan melampirkannya ke pendengar klik wadah penampung klik.Saya juga memiliki pendengar klik lain di Adaptor (Dapat di view view) yang akan menangani klik Lihat saat ini dari wadah.
Dalam aktivitas tersebut Anda perlu menginisialisasi adaptor dengan melewatkan instance dari
OnItemClickListener
Dan ViewHolder saya
sumber
Inilah yang akhirnya saya butuhkan, kalau-kalau ada yang merasa berguna:
Sumber: http://blog.csdn.net/jwzhangjie/article/details/36868515
sumber
Saya punya solusi yang bagus untuk
RecyclerView
'sonItemClickListener
untuk item dan subitemsLangkah 1- Buat antarmuka
Langkah 2- Kemudian gunakan dalam
onBindViewHolder
metode adaptor dengan cara berikutLangkah 3- temukan dan atur tampilan pendaur ulang dalam aktivitas atau fragmen tempat Anda menggunakannya
Langkah 4- Akhirnya implementasikan antarmuka dalam aktivitas atau fragmen tempat Anda menggunakan recyclerview
sumber
Inilah yang saya lakukan. Solusi ini mendukung onClick dan onLongClick pada Item RecyclerView dan Tampilan di dalamnya Item RecyclerView (tampilan internal).
Saya memberi tag viewHolder pada pandangan pilihan saya:
Dan saya menggunakan holder.getPosition () untuk mengambil posisi dalam metode onClick () (onLongClick serupa):
Varian dengan getChildPosition juga berfungsi. Harap perhatikan bahwa untuk tampilan internal, di onClick () gunakan:
Menurut saya, manfaat dari solusi ini adalah bahwa ketika seseorang mengklik gambar, hanya pendengar gambar onclick () yang dipanggil sedangkan ketika saya menggabungkan solusi Jacob untuk tampilan Item RecyclerView dan solusi saya untuk tampilan internal tampilan Item RecyclerView onclick ( ) juga disebut (ketika klik pada gambar).
sumber
Ada cara yang jauh lebih mudah untuk melakukan ini. Cukup gunakan klik pada
onBindViewHolder
pada tampilan root.Pertimbangkan ini pandangan Anda untuk adaptor,
Kemudian lakukan mengikuti di adaptor Anda
sumber
Anda dapat meneruskan
clickListener
keAdapter
.Di Anda
Activity
:kemudian berikan ke
Adapter
:Dalam
Adapter
'sonCreateViewHolder
:sumber
holder
nilai - nilai melalui niat?Saya telah mengembangkan perpustakaan berbobot ringan untuk android, Anda dapat mengunjungi https://github.com/ChathuraHettiarachchi/RecycleClick
dan ikuti untuk sampel berikut
sumber
Anda bisa mengimplementasikan OnClickListener ke kelas ViewHolder Anda
Dan onBindViewHolder mengatur item pemegang tampilan Anda
sumber
Terlalu sederhana dan efektif.
Alih-alih mengimplementasikan antarmuka
View.OnClickListener
di dalam penampil tampilan atau membuat dan antarmuka dan mengimplementasikan antarmuka dalam aktivitas Anda - saya menggunakan kode ini untukOnClickListener
implementasi yang sederhana .sumber
Semua jawaban yang diposting sejauh ini adalah solusi yang bagus, namun jika Anda tidak ingin berurusan dengan terlalu banyak detail implementasi, dan hanya ingin bekerja dengan cara yang mirip dengan ListView, saya akan merekomendasikan menggunakan TwoWay-View, seperti yang terlihat di sini:
https://github.com/lucasr/twoway-view
Perhatikan bahwa implementasi ini juga mendukung tekan lama pada item, serta dukungan untuk negara-negara yang ditekan (yang merupakan sesuatu yang penting yang tidak dimiliki solusi lain untuk pertanyaan ini).
Jika Anda tidak ingin menggunakan seluruh pustaka, lihat kelas ClickItemTouchListener , yang dapat digunakan sebagai mandiri jika diperlukan. Satu-satunya masalah yang saya temukan dengan itu saat ini adalah dengan lama tekan + gulir, tampaknya memiliki perilaku yang salah.
sumber
Jika Anda ingin menangkap event klik Pada item Individual maka cukup terapkan
OnClickListener
diViewHolder
kelas dan kemudian atur klik pendengar pada tampilan individual atau keseluruhanitemView
.Contoh berikut menunjukkan hal yang sama
sumber
Bagi saya, ini adalah cara terbaik:
sumber
Tidak
RecyclerView
memilikiOnClickListener
dan harus mengimplementasikannya sendiri.Saya ingin menambahkan
OnItemClickListener
antarmukaAdapter
denganonClick
metode yang dipanggil ketika Anda mengklik tampilan item dari menuViewHolder
. Dengan demikian tanggung jawab mengelola klik pada item berada di luarViewHolder
danAdapter
. Akankah aktivitas atau fragmen yang akan memutuskan apa yang harus dilakukanTambahkan antarmuka ke objek pendengar dan pendengar.
Kami menangkap klik tampilan root item dan ketika panggilan balik dipicu
onClick
panggilan pendengar pada adaptor.Karena aktivitas atau fragmen, fragmen dalam kasus kami, kami menetapkan pendengar ke adaptor dan panggilan balik onClick, kami akan mendapatkan item yang dipilih berdasarkan posisi dan membuka aktivitas detail item.
sumber
Sayangnya
RecyclerView
ada beberapa fitur yang hilangListView
. Misalnya kemampuan untuk menambahkanOnItemClickListener
yang memicu ketika suatu item diklik.RecyclerView
memungkinkan Anda untuk mengaturOnClickListener
dalam adaptor Anda, tetapi meneruskan pendengar klik itu dari kode panggilan Anda, ke adaptor dan keViewHolder
, rumit untuk menangkap klik item sederhana.Anda juga perlu mendefinisikan
R.id.item_click_support
menggunakan ids.xml:Listener klik kode yang dihasilkan sekarang terlihat seperti ini:
Untuk Penjelasan Singkat tentang klik recyclerview, silakan lihat littlerobots_blog ini
sumber
Anda dapat dengan mudah mendefinisikan setOnClickListener di kelas ViewHolder Anda sebagai berikut:
sumber
Inilah yang saya lakukan Baca lebih lanjut & unduh intinya di sini
Menambahkan yang sama di sini
CustomItemClickListener.java
ItemsListAdapter.java
sumber
Dari sebagian besar jawaban di atas, mereka tampaknya mengatur onclicklisteners mereka untuk masing-masing item. Namun, solusi yang akan saya tawarkan sangat sederhana tetapi belum intuitif bagi banyak orang. Banyak yang lupa bahwa komponen lain selalu dalam komponen induk yang digunakan untuk menampilkan item dalam tampilan Daftar atau Pendaur Ulang. Solusi ini hanya tentang menyetel pendengar onclick tunggal ke tampilan induk ini dan giliran dimainkan. Solusi ini juga mencakup cara untuk melewatkan posisi item yang diklik dari daftar atau tampilan pendaur ulang. Di sini, rootview utama kami adalah CardView dari perpustakaan dukungan android. Berikut ini contoh kode
sumber
Implementasi Kotlin dari jawaban nhaarman :
RecyclerItemClickListener.java:
sumber
sumber
sumber
Kita dapat melakukan ini menggunakan referensi lemah Java. Semantik, pemegang tampilan adalah yang harus menanggapi acara klik atau mendelegasikannya ke responden yang benar.
Tujuan kita:
Langkah:
Buat antarmuka untuk menangani respons klik.
Terapkan antarmuka ini dalam Aktivitas yang akan menangani klik.
Tambahkan variabel anggota dalam Adaptor RecyclerView untuk menahan Referensi Lemah dan konstruktor yang menetapkannya.
Lakukan hal yang sama di RecyclerView ViewHolder dan tambahkan variabel anggota untuk melacak posisi.
Atur pendengar klik Anda pada tampilan yang Anda inginkan di ViewHolder, lalu panggil balik ke responden untuk menanganinya.
Ubah metode onBindViewHolder Anda untuk mengatur posisi saat mengikat.
Lewatkan responden ke ViewHolder.
Di responden, Anda sekarang dapat menggunakan getId () pada tampilan untuk mengetahui tampilan mana yang diklik.
Dan inilah Intis sehingga Anda dapat melihat bagaimana semuanya cocok: penanganan klik RecyclerView
sumber
Saya sadar ada banyak jawaban, tetapi saya pikir saya mungkin hanya memberikan implementasi saya juga. (Rincian lengkap dapat ditemukan pada pertanyaan lain yang saya jawab ).
Jadi, untuk menambahkan pendengar klik,
ViewHolder
kelas batin Anda perlu diimplementasikanView.OnClickListener
. Hal ini karena Anda akan mengaturOnClickListener
denganitemView
parameterViewHolder
's konstruktor. Biarkan saya menunjukkan kepada Anda apa yang saya maksud:Satu-satunya hal lain yang perlu Anda tambahkan adalah antarmuka khusus untuk Anda
Adapter
dan metode penyetel:Jadi pendukung klik baru Anda
Adapter
sudah lengkap.Sekarang, mari kita gunakan ...
Ini pada dasarnya bagaimana Anda mengatur normal
Adapter
, kecuali bahwa Anda menggunakan metode setter yang Anda buat untuk mengontrol apa yang akan Anda lakukan ketika pengguna mengklik item daftar tertentu.Anda juga dapat melihat sekumpulan contoh yang saya buat pada Intisari ini di GitHub:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
sumber
Inilah yang saya lakukan untuk digunakan kembali
OnClickListener
di ViewHoder Ambil induk itemlayout
di onBindViewHolder atur tag sebagai posisi
dan di Onclick
sumber
Bagi saya cara bersih untuk melakukannya adalah yang ini.
Konstruktor adaptor
Antarmuka Tertaut
sumber