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

标签 android listview android-listview android-arrayadapter onclicklistener

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/

相关文章:

android - 需要 Unity3D Gradle 版本 2.10

c# - 根据下拉选择 c# 填充 Listview

android - CardView 和 RecyclerView 分隔符行为

android - Listview 添加到同一行

android - 有没有办法向 android.util.log 添加监听器?

java - 如何在android中获取两个时间差

html - 滚动时在页面顶部制作 Jquery 移动列表分隔符 "stick"

android - 如何在android中使用快速滚动?

android - Glide 在构建应用程序时显示错误

android - 为某些 ListView 项目设置动画