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

1.jpg<. 🎜>

Terdapat

Recycler 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!

2.png

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:

Orang kelas awam melaksanakan Boleh Bersiri{
    nama String pribadi;
    nombor cincin St peribadi;
                                                              Status                                                                              Status                                                                          Status nombor) {
Super (); 🎜> name kembali;
}

setname void public (nama string) { this.name = name;
}

rentetan awam getNumber () {
Nombor kembali;     }

    public void setCheckStatus(boolean checkStatus) {
        this.checkStatus = checkStatus;
    }
    }
    
<🎜

Kelas Penyesuai yang Dilaksanakan: ContactListAdapter.java:

kelas awam ContactListAdapter melanjutkan BaseAdapter melaksanakan CompoundButton.OnCheckedChangeListener{

    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~