Вы не объясняете, почему вам нужны отдельные прослушиватели кликов для каждой строки, но я бы рекомендовал против этого.Взгляните на использование View.setTag(Object)
/ View.getTag()
для передачи специфичных для строки пользовательских данных, с помощью которых вы можете настроить ответ (общего) прослушивателя щелчков.
EDIT
Я вижу из вашего примера, почему вы хотите, чтобы различные OnClickListener
были присоединены к вашим строкам.У меня сложилось впечатление, что вы хотели отдельный экземпляр OnClickListener
для каждой строки.(Это была моя главная причина, по которой я рекомендовал против этого.) Если у вас есть два типа строк (категории и заголовки) и сотни строк, вам нужны только два типа ответов, а не сотни.Я также понимаю смысл разделения проблем.
Тем не менее, я думаю, что переопределение ListActivity.onListItemClick()
(или вызов ListView.setOnItemClickListener()
, если вы не используете ListActivity
) будет чище и с меньшей вероятностью будет мешатьоперация представления списка.Для этого можно использовать шаблон делегата следующим образом.
Определите абстрактный класс или интерфейс:
public interface MyClickHandler {
public void onItemClick(ListView l, View v, int position, long id);
}
Затем создайте один экземпляр объекта, который реализует этот интерфейс для каждого введите данных строки (не один экземпляр для каждой строки).В вашем адаптере используйте setTag(Object)
, чтобы инициализировать тег для каждой строки в соответствующем экземпляре MyClickHander
.В переопределении ListActivity.onListItemClick()
используйте эту логику:
protected void onListItemClick(ListView l, View v, int position, long id) {
Object tag = v.getTag();
if (tag instanceof MyClickHandler) {
((MyClickHandler) tag).onItemClick(l, v, position, id);
} else {
// default processing (if any)
}
}