您设置的每个侦听器都将覆盖前一个侦听器(如果有)。
设置侦听器或其他任何东西会消耗极少的时间,但是在这里您还要创建一个新的匿名类,这将花费更长的时间。
为了获得最佳性能,我会做一些调整:
- 使用
convertView
s 缓存视图
- 使用
ViewHolder
模式避免多次findViewById
调用
- 对所有复选框使用单个侦听器并仅在缓存视图上设置它(如果
convertView == null
)
- 将 CheckBox 所在的 item 的位置保存为 CheckBox 的标签
这是一个例子:
private static class ViewHolder {
CheckBox checkBox;
}
private CompoundButton.OnCheckedChangeListener mCheckListener = new CompoundButton
.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.e("TAG", "CheckBox position: " + buttonView.getTag());
}
};
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
/* Inflate the layout here */
holder = new ViewHolder();
holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
/* Find other views in you layout here */
holder.checkBox.setOnCheckedChangeListener(mCheckListener);
// Set the holder as tag, so you can fetch it later for re-use
convertView.setTag(holder);
} else {
// Fetch the holder
holder = (ViewHolder) convertView.getTag();
}
// Set the checkbox position
holder.checkBox.setTag(position);
return convertView;
}
如果您不熟悉使用convertViews
和ViewHolder
模式,您应该观看解释这一切的 ListView 世界。