3

OnClickListener为 中的每一行注册一个唯一的对我来说会更方便ListView,但我想确保这是一种可以接受的做法。我目前的设计是一种相当复杂的方式来分离OnClickListener每个行类型的关注点。

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

我希望行本身保持有关其自己的身份和责任的知识,而不是泄露有关要由onItemClickListener.

我还想知道执行此操作与实现我自己的逻辑以弄清楚如何处理点击对性能的影响。

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

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

4

1 回答 1

5

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

编辑

我从您的示例中看到为什么您希望将不同OnClickListener的 s 附加到您的行。我的印象是您希望OnClickListener每行都有一个单独的实例。(这是我反对这个的主要原因。)如果你有两种类型的行(类别和标题)和数百行,你只需要两种响应,而不是数百个。我也理解分离关注点的意义。

尽管如此,我认为覆盖(或者如果您不使用 a 则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)
    }
}
于 2012-03-14T18:50:55.117 回答