Pengoptimuman BaseAdapter
Pengenalan kepada bahagian ini:
Dalam bahagian sebelumnya, kami mempelajari cara menggunakan ListView dan menyesuaikan BaseAdapter yang mudah Kami mulakan dengan kod Kita boleh melihat dua kaedah penting: getCount() dan getView() akan dipanggil seberapa kerap terdapat lajur pada antara muka. Anda mungkin melihat beberapa petunjuk pada masa ini Setiap kali Paparan baru meningkat, XML mesti dihuraikan Ia adalah pembaziran sumber Sudah tentu, senarai dengan berpuluh-puluh atau beratus-ratus lajur tidak menggambarkan sebarang masalah, tetapi bagaimana jika terdapat lebih banyak atau susun aturnya lebih rumit? Oleh itu, adalah sangat penting untuk mempelajari pengoptimuman ListView, dan bahagian ini bertujuan untuk pengoptimuman BaseAdapter Dua titik pengoptimuman ialah: guna semula convertView Dan gunakan ViewHolder untuk menggunakan semula komponen tanpa perlu mencari ViewById setiap kali Mari kita mengalaminya melalui kod!
1. Guna Semula ConvertView:
Seperti yang dinyatakan di atas, berapa banyak Item pada antara muka, maka berapa kali kaedah getView akan dipanggil! Mari kita lihat kod getView() yang kami tulis dalam bahagian sebelumnya:
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
TextView txt_aName = (txt_aName) TextView) convertView.findViewById(R.id.txt_aName);
TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
img_icon.setBackgroundResource(mData.get(mData). getaIcon());
txt_aName.setText(mData.get(position).getaName());
txt_aSpeak.setText(mData.get(position).getaSpeak());
return convertView;
}
Ya, inflate() perlu memuatkan xml setiap kali Sebenarnya, convertView ini ialah View yang disediakan oleh sistem untuk kita gunakan. cache objek, kemudian duduk dan nilaikan kod yang dioptimumkan:
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
}
ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
TextView txt_aSpeak = (TextView) convertView.find_ViewByIdtxt ;
img_icon.setBackgroundResource(mData.get(position).getaIcon());
txt_aName.setText(mData.get(position).getaName());
txt_aSpeak .setText(mData .get(position).getaSpeak());
return convertView;
}
2. ViewHolder menggunakan semula komponen
Hei, getView() akan dipanggil beberapa kali, jadi findViewById perlu dipanggil beberapa kali dan Item ListView kami Secara umumnya susun aturnya adalah sama Kita boleh mengoptimumkan bahagian ini dengan menentukan sendiri kelas ViewHolder. Lakukan pengoptimuman prestasi! Kod yang diubah suai adalah seperti berikut:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if ( convertView == null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
holder = new ViewHolder();
holder.img_icon = ( ImageView ) convertView.findViewById(R.id.img_icon);
holder.txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
holder.txt_aSpeak = (TextView) convertView.findR.ById id .txt_aSpeak);
convertView.setTag(holder); //Pemegang Simpan ke dalam pemegang convertView
}lain{
= (ViewHolder) convertView.getTag();
}
pemegang . img_icon.setBackgroundResource(mData.get(position).getaIcon());
holder.txt_aName.setText(mData.get(position).getaName());
holder.txt_aSpeak.setText(mData.get ( position).getaSpeak());
return convertView;
}
class statik ViewHolder{
ImageView img_icon;
TextView txt_aName;
TextView txt_aSpeak;
}
Ya, semudah itu Anda hanya boleh menulis BaseAdapter mengikut templat ini pada masa hadapan, haha, dan yang ini mengubah suai ViewHolder. statik, sama ada ia ditakrifkan sebagai statik tiada kaitan dengan bilangan objek di dalamnya ditambah untuk menggunakan ini di beberapa tempat. Apabila menggunakan Holder, kelas hanya perlu dimuatkan sekali Jika ia hanya digunakan sekali, tidak kira ia ditambah atau tidak! ——Perkataan asal Berial (Tuhan B)~
Ringkasan bahagian ini:
Baiklah, mengenai pengoptimuman BaseAdapter The dua di atas adalah sangat mudah, menggunakan semula ConvertView dan ViewHolder tersuai Kurangkan panggilan untuk findViewById()~ Jika anda mempunyai cadangan lain untuk pengoptimuman BaseAdapter, sila lakukannya, terima kasih~