2015-01-31 4 views
1

У меня вопрос о 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 
     }    
    }); 

} 

Как вы можете видеть, что я установить setOnCheckedChangeListener каждый раз, когда GetView метод. Так это правильный способ установить слушателя? Или я должен установить его один раз? Это плохо с точки зрения производительности? Или это не имеет значения? И если я установлю слушателя несколько раз, будет ли он перезаписывать предыдущий прослушиватель или у меня будет несколько слушателей для этого события?

ответ

1

Плохо ли с точки зрения производительности? Или это не имеет значения?

Это не имеет значения. Установщик просто назначает объект.

И если я устанавливаю слушатель несколько раз, будет ли он перезаписать предыдущего слушателя или будет у меня есть несколько слушателей для этого события?

у вас будет только один для каждого экземпляра флажка по вашему адресу setOnCheckedChangeListener. ListView является частным случаем из-за его механизма рециркуляции

1

Каждый выбранный вами прослушиватель перезапишет предыдущий (если есть).
Настройка прослушивателя или всего остального будет потреблять очень мало времени, однако здесь вы также создаете новый анонимный класс, который займет больше времени.

Для достижения максимальной производительности, я хотел бы сделать несколько изменений:

  1. Использование convertView s кэшировать мнения
  2. Используйте ViewHolder шаблон, чтобы избежать мультипликатор findViewById вызовов
  3. Используйте один прослушиватель для всех флажков и установите его только на кешированные виды (если convertView == null)
  4. Сохраните позицию элемента, который находится в CheckBox, в качестве тега 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 шаблон, который вы должны смотреть The World of ListView, что объясняет все.

Смежные вопросы