Saya mencoba menggunakan RecyclerView
sebagai horizontal ListView
. Saya mencoba mencari cara untuk menyorot item yang dipilih. Ketika saya mengklik salah satu item, itu akan dipilih dan disorot dengan benar tetapi ketika saya mengklik yang lain, yang kedua akan disorot dengan yang lebih tua.
Inilah fungsi onClick saya:
@Override
public void onClick(View view) {
if(selectedListItem!=null){
Log.d(TAG, "selectedListItem " + getPosition() + " " + item);
selectedListItem.setBackgroundColor(Color.RED);
}
Log.d(TAG, "onClick " + getPosition() + " " + item);
viewHolderListener.onIndexChanged(getPosition());
selectedPosition = getPosition();
view.setBackgroundColor(Color.CYAN);
selectedListItem = view;
}
Ini dia onBindViewHolder
:
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.setItem(fruitsData[position]);
if(selectedPosition == position)
viewHolder.itemView.setBackgroundColor(Color.CYAN);
else
viewHolder.itemView.setBackgroundColor(Color.RED);
}
android
android-recyclerview
recycler-adapter
pengguna65721
sumber
sumber
Jawaban:
Saya menulis kelas adaptor dasar untuk secara otomatis menangani pemilihan item dengan RecyclerView. Turunkan adaptor Anda darinya dan gunakan daftar status yang dapat ditarik dengan state_selected, seperti yang akan Anda lakukan dengan tampilan daftar.
Saya punya Posting Blog Di Sini tentang itu, tetapi di sini adalah kodenya:
sumber
mRecyclerView
tidak dinyatakan di mana pun. Haruskah kita hanya meneruskannya sebagai parameter di konstruktor dan menyimpannya di bidang?onRecyclerViewAttached
dan simpan dalam variabel anggota di sana.TrackSelectionAdapter
kelas Anda dan menggunakannya di daftar saya? Bagaimana cara "mendapatkan adaptor saya dari kelas Anda"? Bisakah Anda menjawab pertanyaan saya? Saya terjebak sangat dalam: stackoverflow.com/questions/29695811/…Ini adalah cara sederhana untuk melakukannya.
Memiliki
private int selectedPos = RecyclerView.NO_POSITION;
di kelas Adapter RecyclerView, dan di bawah metode onBindViewHolder coba:Dan di acara OnClick Anda, modifikasi:
Bekerja seperti pesona untuk Laci Navigasi dan Adaptor Item RecyclerView lainnya.
Catatan: Pastikan untuk menggunakan warna latar belakang dalam tata letak Anda menggunakan pemilih seperti colabug yang diklarifikasi:
Jika tidak, setSelected (..) tidak akan melakukan apa-apa, menjadikan solusi ini tidak berguna.
sumber
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/pressed_color" android:state_pressed="true"/> <item android:drawable="@color/selected_color" android:state_selected="true"/> <item android:drawable="@color/focused_color" android:state_focused="true"/> </selector>
vieHolder.getLayoutPosition
UPDATE [26 / Jul / 2017]:
Semoga ini bisa membantu.
sumber
Implementasi Anda kemungkinan berhasil jika Anda menggulir konten keluar dari tampilan lalu kembali ke tampilan. Saya mengalami masalah serupa ketika saya menemukan pertanyaan Anda.
Cuplikan file berikut ini berfungsi untuk saya. Implementasi saya ditujukan pada banyak pilihan, tetapi saya melakukan hack di sana untuk memaksa seleksi tunggal. (* 1)
Seperti dicatat dalam pertanyaan terkait ini , pengaturan pendengar untuk viewHolders harus dilakukan di onCreateViewHolder. Saya lupa menyebutkan ini sebelumnya.
sumber
Saya pikir, saya telah menemukan tutorial terbaik tentang cara menggunakan RecyclerView dengan semua fungsi dasar yang kita butuhkan (single + multiselection, highlight, ripple, klik dan hapus di multiselection, dll ...).
Ini dia -> http://enoent.fr/blog/2015/01/18/recyclerview-basics/
Berdasarkan hal itu, saya dapat membuat perpustakaan "FlexibleAdapter", yang memperluas SelectableAdapter. Saya pikir ini harus menjadi tanggung jawab Adaptor, sebenarnya Anda tidak perlu menulis ulang fungsi dasar Adaptor setiap kali, biarkan perpustakaan untuk melakukannya, sehingga Anda bisa menggunakan kembali implementasi yang sama.
Adaptor ini sangat cepat, berfungsi di luar kotak (Anda tidak perlu memperpanjangnya); Anda menyesuaikan item untuk setiap jenis tampilan yang Anda butuhkan; ViewHolder sudah ditentukan sebelumnya: peristiwa umum sudah diterapkan: klik tunggal dan panjang; itu mempertahankan keadaan setelah rotasi dan banyak lagi .
Silakan melihat dan merasa bebas untuk mengimplementasikannya di proyek Anda.
https://github.com/davideas/FlexibleAdapter
Wiki juga tersedia.
sumber
Lihat solusi saya. Saya kira Anda harus mengatur posisi yang dipilih pada tempatnya dan memberikannya sebagai Tag of View. Tampilan harus diatur dalam metode onCreateViewHolder (...). Ada juga tempat yang benar untuk mengatur pendengar untuk tampilan seperti OnClickListener atau LongClickListener.
Silakan lihat contoh di bawah ini dan baca komentar untuk kode.
sumber
tidak ada pemilih di RecyclerView seperti ListView dan GridView tetapi Anda mencoba di bawah ini berfungsi untuk saya
buat pemilih yang bisa ditarik seperti di bawah ini
kemudian atur gambar ini sebagai latar belakang tata letak baris RecyclerView Anda sebagai
sumber
Keputusan dengan Antarmuka dan Callback. Buat Antarmuka dengan status pilih dan batalkan pilihan:
Implementasikan antarmuka di ViewHolder:
Jalankan perubahan status pada Callback:
Buat RecyclerView dengan Callback (contoh):
Lihat lebih banyak di artikel iPaulPro: https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-6a6f0c422efd#.6gh29uaaz
sumber
ini solusi saya, Anda dapat mengatur pada item (atau grup) dan membatalkan pilihan dengan klik lain:
sumber
Saya memiliki Masalah yang sama dan saya menyelesaikannya dengan cara berikut:
File xml yang digunakan untuk membuat Baris di dalam createViewholder, cukup tambahkan baris di bawah ini:
ATAU Jika Anda menggunakan frameLayout sebagai induk dari item baris, maka:
Dalam kode java di dalam view holder tempat Anda menambahkan pada pendengar klik:
sumber
Saya tidak dapat menemukan solusi yang baik di web untuk masalah ini dan menyelesaikannya sendiri. Ada banyak orang yang menderita masalah ini. Jadi saya ingin membagikan solusi saya di sini.
Saat menggulir, baris didaur ulang. Dengan demikian, kotak centang yang dicentang dan baris yang disorot tidak berfungsi dengan benar. Saya memecahkan masalah ini dengan menulis kelas adaptor di bawah ini.
Saya juga menerapkan proyek penuh. Dalam proyek ini, Anda dapat memilih beberapa kotak centang. Baris termasuk kotak centang yang dipilih disorot. Dan yang lebih penting, ini tidak hilang saat menggulir. Anda dapat mengunduhnya dari tautan:
https://www.dropbox.com/s/ssm58w62gw32i29/recyclerView_checkbox_highlight.zip?dl=0
Tangkapan layar aplikasi:
sumber
Setel
private int selected_position = -1;
untuk mencegah item apa pun dipilih pada awal.sumber
Hanya menambahkan
android:background="?attr/selectableItemBackgroundBorderless"
berfungsi jika Anda tidak memiliki warna latar belakang, tetapi jangan lupa untuk menggunakan metode setSelected. Jika Anda memiliki warna latar belakang yang berbeda, saya hanya menggunakan ini (saya menggunakan data-binding);Setel Dipilih di fungsi onClick
Dan tambahkan ini ke xml;
sumber
Jadikan pemilih:
Atur sebagai latar belakang pada tata letak item daftar Anda
Dalam adaptor Anda, tambahkan OnClickListener ke tampilan (metode onBind)
Di acara onClick, aktifkan tampilan:
sumber