【问题标题】:Difference between RowId and Position in onItemLongClick's parameteronItemLongClick参数中RowId和Position的区别
【发布时间】:2011-04-30 18:24:40
【问题描述】:

我对 onItemLongClick(...) 的第三个和第四个参数感到困惑。 根据AdapterView.OnItemLongClickListener

position - 视图在列表中的位置

id - 被点击的项目的行 id

我无法理解这些,请指教。

【问题讨论】:

    标签: android listview


    【解决方案1】:

    position 是被点击的元素在你的适配器中的位置(所以你可以这样做 adapter.getItem(position)

    row id 是对应于该元素的 id,即您的适配器在 getItemId() 方法中返回的内容。

    【讨论】:

    • 这是否意味着行ID由视图分配列表视图并且可能并不总是按顺序排列,如果我想点击视图我使用view.getchildat(位置)正确?
    • 嗯,不完全是。这就是事情变得棘手的地方。 getChildAt() 来自 ViewGroup 类,因此您传递给它的索引是相对于列表的视图,而不是适配器。但是,您已经拥有被点击的视图(第二个参数),因此您不需要为此目的使用 getChildAt()。至于 getItemId(),我不确定您正在使用的适配器的默认行为是什么,但它在您的上下文中可能没有任何有用的含义。
    • 啊,你是对的,我应该只是将参数中提供的视图和位置用于其他目的。我曾经记得我用 ID 对一些 sqlite 表的主键 _ID 做一些事情。非常感谢!
    【解决方案2】:

    positionviewparent中的位置。对于ListView,它是行号。第一行是位置 0,第二行是位置 1,第三行是位置 2,依此类推。请注意,如果您的 ListView 有标题视图(就像您使用 ListView.addHeaderView(View) 一样),那么标题视图将是位置0 并且实际的行将从 1 开始编号。

    有时 idposition 相同,有时又不同。如果您使用的是ArrayAdapterSimpleAdapter,那么它们是相同的(除非有一个标题视图,然后它们被关闭了一个)。对于CursorAdapter(以及随后的SimpleCursorAdapter),id 返回表的行ID,即_idPositionlong 而不是 int,因为理论上数据库的行数可能比 int 可以容纳的行数多,而ListView 不会。

    这里有一些其他相关的答案:

    【讨论】:

    • 我相信这就是适配器使用游标需要 _id 的原因。根据游标必须包含名为“_id”的列,否则此类将不起作用。CursorAdapter所选项目的行 ID AdapterView.OnItemSelectedListener 也可以提供更多信息。但是,@Suragch,感谢您的详细解释,它澄清了我的怀疑。
    【解决方案3】:

    Position 将返回该位置上的所有名称或值,例如,如果您在列表中显示 raj,kamal,prateek 并且位置 2 被选中,它将显示(返回)kamal

    如果您选择行 ID,它将返回特定的固定数字或位于该项目的 ID,例如同一程序上的 1,2,3,4 ... 如果您选择行 ID,它将返回 2,对于位置,它将返回 @987654324 @。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2015-08-27
      相关资源
      最近更新 更多