多个听众

时间:2015-01-31 11:22:43

标签: java android listener listview-adapter

我有关于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。 那么设置监听器是正确的方法吗?或者我应该设置一次?性能方面不好吗?或者它并不重要?如果我多次设置监听器是否会覆盖以前的监听器,或者我将为此事件设置多个监听器?

2 个答案:

答案 0 :(得分:1)

  

性能方面不好吗?或者这没关系?

没关系。 setter只是分配对象。

  

如果我多次设置监听器是否会覆盖   以前的听众还是我会有多个听众参加这个活动?

在您致电setOnCheckedChangeListener时,您的每个复选框实例只有一个。由于其回收机制,ListView是特殊情况

答案 1 :(得分:1)

您设置的每个侦听器都将覆盖前一个侦听器(如果有)。
设置一个听众或其他任何东西都会消耗很少的时间,但是在这里你还要创建一个新的匿名课程,这需要更长的时间。

为了获得最佳性能,我会做一些调整:

  1. 使用convertView来缓存视图
  2. 使用ViewHolder模式避免多次findViewById来电
  3. 对所有复选框使用单个侦听器,并仅在缓存的视图上设置(如果convertView == null
  4. 将CheckBox所在项目的位置保存为CheckBox的标记
  5. 以下是一个例子:

    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;
    }
    

    如果您不熟悉使用convertViewsViewHolder模式,则应该注意The World of ListView解释所有内容。