为每个ListView行而不是onItemClickListener实现onClickListener是否有缺点?

时间:2012-03-14 18:47:01

标签: android listview android-listview android-arrayadapter onclicklistener

OnClickListener中的每一行注册一个唯一的ListView会更方便,但我想确保这是一种可接受的做法。我的current design是将OnClickListener与每一行类型的关注点分开的一种相当复杂的方法。

原因是我在ListView中有多个行类。每个班级都有完全不同的责任和行为。例如,考虑一个ListView,它可以包含子类别和书名。如果单击书名,则应开始显示封面图像的新活动。如果单击子类别,则会显示新的书籍和类别列表。

我希望该行本身能够保持对其自身身份和责任的了解,而不必泄漏有关onItemClickListener的实施者要维护的每一行的知识。

我还想知道这样做的性能影响与实现我自己的逻辑以确定如何处理点击有关。

为每个onClickListener ListView行而不是ArrayAdapter实施onItemClickListener是否有弊端?我正在寻找具体数据特定缺点,而不是模糊的建议。

我是否应该期望内存使用初始化时间稳态速度(如滚动列表)会受到严重影响?

1 个答案:

答案 0 :(得分:5)

您没有解释为什么每行需要单独的点击侦听器,但我建议不要这样做。请查看使用View.setTag(Object) / View.getTag()传递特定于行的自定义数据,您可以通过该数据自定义(共享)点击侦​​听器的响应。

修改

我从您的示例中看到为什么您希望不同的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)
    }
}