为 ListView
中的每一行注册一个唯一的 OnClickListener
对我来说会更方便,但我想确保这是一种可接受的做法。我的current design是将 OnClickListener
的关注点与每种行类型分开的一种相当复杂的方法。
这样做的原因是我在 ListView
中有多个行类。每个类都有完全不同的责任和行为。例如,考虑一个可以同时包含子类别和书名的 ListView
。如果单击书名,则应启动一个显示封面图像的新 Activity 。如果单击子类别,则会显示新的图书和类别列表。
我希望行本身能够维护有关其自身身份和责任的知识,而不是必须泄露有关由 onItemClickListener
的实现者维护的每一行的知识。
我还想知道这样做与实现我自己的逻辑来弄清楚如何处理点击相比,对性能有何影响。
为每个 ListView
ArrayAdapter
行而不是 onItemClickListener
实现 onClickListener
是否有缺点?我正在寻找具体数据和具体缺点,而不是模糊的建议。
我是否应该预期内存使用、初始化时间或稳态速度(如滚动列表)会受到显着影响?
最佳答案
您没有解释为什么每一行都需要单独的点击监听器,但我建议不要这样做。看一下使用 View.setTag(Object)
/View.getTag()
来传递行特定的自定义数据,通过它您可以自定义(共享)的响应点击监听器。
编辑
我从您的示例中看出您为什么要将不同的 OnClickListener
附加到您的行。我的印象是您希望每一行都有一个单独的 OnClickListener
实例。 (这是我反对这样做的主要原因。)如果你有两种类型的行(类别和标题)和数百行,你只需要两种响应,而不是数百种。我也理解分离关注点的意义。
尽管如此,我认为重写 ListActivity.onListItemClick()
(或者调用 ListView.setOnItemClickListener()
如果您不使用 ListActivity
) 会更干净并且不太可能干扰 ListView 的操作。您可以为此使用委托(delegate)模式,如下所示。
定义一个抽象类或接口(interface):
public interface MyClickHandler {
public void onItemClick(ListView l, View v, int position, long id);
}
然后为每个类型 的行数据创建一个实现此接口(interface)的对象实例(不是每一行一个实例)。在您的适配器中,使用 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)
}
}
关于android - 为每个 ListView 行而不是 onItemClickListener 实现 onClickListener 是否有缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9708208/