我有关于ListView和听众的问题。 假设我的应用程序中有一个列表视图。它的每个项目都包含一个复选框。 我有以下代码:
public View getView(final int position, View convertView, ViewGroup parent) {
CheckBox checkbox = (CheckBox)v.findViewById(R.id.checkbox);
checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// some code
}
});
}
正如您所看到的,每次调用 getView 方法时,我都会设置setOnCheckedChangeListener。 那么设置监听器是正确的方法吗?或者我应该设置一次?性能方面不好吗?或者它并不重要?如果我多次设置监听器是否会覆盖以前的监听器,或者我将为此事件设置多个监听器?
答案 0 :(得分:1)
性能方面不好吗?或者这没关系?
没关系。 setter只是分配对象。
如果我多次设置监听器是否会覆盖 以前的听众还是我会有多个听众参加这个活动?
在您致电setOnCheckedChangeListener
时,您的每个复选框实例只有一个。由于其回收机制,ListView
是特殊情况
答案 1 :(得分:1)
您设置的每个侦听器都将覆盖前一个侦听器(如果有)。
设置一个听众或其他任何东西都会消耗很少的时间,但是在这里你还要创建一个新的匿名课程,这需要更长的时间。
为了获得最佳性能,我会做一些调整:
convertView
来缓存视图ViewHolder
模式避免多次findViewById
来电convertView == null
)以下是一个例子:
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
模式,则应该注意The World of ListView解释所有内容。