您没有解释为什么每行需要单独的单击侦听器,但我建议不要这样做.看一下使用View.setTag(Object)/View.getTag()传递特定于行的自定义数据,通过它可以自定义(共享)单击侦听器的响应.
编辑
我从您的示例中看到为什么您希望将不同的OnClickListener附加到您的行.我的印象是你想为每一行单独的OnClickListener实例. (这是我推荐反对这一点的主要原因.)如果你有两种类型的行(类别和标题)和数百行,你只需要两种响应,而不是数百种.我也理解关于分离问题的观点.
不过,我认为重写ListActivity.onListItemClick()(或者如果不使用ListActivity则调用ListView.setOnItemClickListener())会更干净,并且不太可能干扰列表视图的操作.您可以使用委托模式,如下所示.
定义抽象类或接口:
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)
}
}