Menyelesaikan masalah penjajaran kotak pilihan dalam ListView
Pengenalan kepada bahagian ini:
Sebagai salah satu masalah klasik ListView, jika anda telah cuba menyesuaikan item ListView dengan kotak pilihan padanya, maka Masalah ini akan berlaku apabila bilangan item anda melebihi satu halaman Mari analisa sebab masalah ini dan cara menyelesaikannya. Selesaikan masalah ini!
1 Punca masalah:
Ini ialah gambar yang terdapat di Internet mengenai mekanisme panggilan kaedah ListView getView
<. 🎜>
TerdapatRecycler dalam gambar di atas Biasanya Item yang kelihatan pada ListView kami berada di dalam memori, dan Itemnya diletakkan di dalam Dalam Recycler ini, apabila item dimuatkan buat kali pertama, convertView dalam halaman semasa adalah NULL Apabila menatal keluar dari skrin, kali ini ConvertView tidak kosong, jadi item baharu akan menggunakan semula ini. ConvertView! Kita boleh menulis contoh mudah dan mengikuti log Berikut adalah beberapa gambar rajah Log selepas dijalankan!
Seperti yang dapat dilihat dari gambar, bermula dari Position 12, ConvertView tidak lagi kosong secara khusus. Saya juga tidak tahu. Saya perlu menyemak kod sumber secara visual... Kami tahu bahawa ConvertView akan dicache di sini. Kotak pilihan tidak sejajar, jadi penyelesaian pertama adalah tidak menggunakan semula ConvertView ini, atau Dikatakan bahawa setiap kali getView menetapkan ConvertView ini kepada null, tetapi jika bilangan Item yang perlu dipaparkan adalah besar, Kaedah ini akan kelihatan sangat membengkak Secara amnya, dalam pembangunan sebenar, kami menggunakan penyelesaian berikut:Cari sesuatu untuk menyimpan status Kotak Semak Item semasa, dan nilaikannya semasa permulaan untuk menetapkan sama ada ia dipilih!
2. Contoh penyelesaian:
Terdapat banyak cara yang baik untuk menyimpan Kotak Semak ini, anda boleh meletakkannya dalam HashMap<Integer, Boolean> Semasa setiap permulaan, nilai boolean yang sepadan dikeluarkan mengikut kedudukan, dan kemudian status kotak semak ditetapkan; Pendekatan pengarang ialah menambah nilai boolean pada kelas entiti untuk pertimbangan Berikut ialah salah satu projek pengarang. Kod yang diekstrak agak mudah, saya percaya anda akan memahaminya dalam beberapa saat~Kelas entiti:
Person.java:
nama String pribadi;
nombor cincin St peribadi;
Status Status Status nombor) {
Super (); 🎜> name kembali;
}
setname void public (nama string) {
}
rentetan awam getNumber () {
Nombor kembali;
public void setCheckStatus(boolean checkStatus) {
this.checkStatus = checkStatus;
}
}
<🎜
Kelas Penyesuai yang Dilaksanakan: ContactListAdapter.java:
senarai peribadi<Person> mData;
pribadi Konteks mKonteks;
awam ContactListAdapter(Senarai<Orang> data, Konteks konteks) {
m
// 定义一个刷新数据的方法
public void changeData(Senarai<Orang> data) {
= = Data digantung();
}
@Override
public int getCount () {
return mdata.size ();
}
@Override
orang awam getItem (int rosition) {
kembali mdata.get ( position);
}
@Override
public long getItemId(int position) {
return position;
> (int position, View convertView, ViewGroup parent) {
final int index = posisi;
ViewHolder viewHolder;
jika (convert View == null) = null) = null lebih rata.daripada(mKonteks).mengembung (
r.layout.item_contact, ibu bapa, palsu);
ViewHolder = NewHolder (); 🎜> ViewHolder.TxtName = (TextView) ConvertView
.FindViewById (r.id.txtName);
ViewHolder.TxtNumber = (TextView) ConvertView
.FindViewByID (r.id.txtNumber); cbxStatus = (CheckBox) convertView
.findViewById(R.id.cbxStatus);
convertView.setTag(view Holder). indeks);
} lain {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.cbxStatus.setOnCheckedChangeListener(this);
viewHolder.cbxStatus . > ViewHolder.txtName.settext (mdata.get (index) .getName ());
viewHolder.txtNumber.settext (mdata.get (index) .getNumber ());
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int index = (int)buttonView.get Tag() ( mData.get (index).setCheckStatus(true);
lain
mData.get(index).setCheckStatus(false);
}
pribadi Pandangan Lama semula kelas sendiri awak ;
TextView txtName;
TextView txtNumber;
CheckBox cbxStatus;
}
}
Hei, ia sangat mudah, jangan lupa satu perkara lagi: Kaedah pendengar kotak semak harus ditambah sebelum kod yang memulakan keadaan Kotak Semak~
Pengenalan kepada bahagian ini:
Baiklah, bahagian ini menerangkan kepada anda masalah klasik ListView, kotak pilihan dalam ListView tersalah letak Masalah diselesaikan dengan hanya menambah nilai yang merekodkan status pemilihan kotak semak, dan kemudian menulis semula kotak pilihan Apabila mengklik pada acara, buat pertimbangan dahulu~Terima kasih~