【问题标题】:Android: onItemClick()'s position is relative to viewable area, not entire listAndroid:onItemClick() 的位置是相对于可视区域,而不是整个列表
【发布时间】:2013-11-04 18:47:56
【问题描述】:

我对 AdapterView.OnItemClickListener 中的某些行为有疑问,这让我有点困惑。

我有一个由自定义 CursorAdapter 支持的 ListView。游标由 LoaderManager 管理。 ListView 也有一个 OnItemClickListener。数据正确加载并且 ListView 被正确填充 - 在本例中包含许多项目。

我发现 onItemClickposition 参数相对于屏幕上显示的项目是从 0 开始的,而不是整个列表。因此,例如,如果我向下滚动并选择第一个可查看的项目,我实际上将获得列表中的第一个项目(不可见)而不是我选择的项目。当我使用调试器时,我看到 position 实际上的值为 0,即使选择的项目在列表中更靠后。

奇怪的是,在我开始使用 LoaderManager 之前,它运行良好。

我正在使用 v4 支持库。

如果我这样做:

public void onItemClick( AdapterView<?> parent, View listItem, int position, long id ) {

    Cursor c = myListAdapter.getItem( parent.getFirstVisiblePosition() + position );

    // do stuff

然后我得到了我实际选择的数据,但不知何故我觉得这是错误的。我不应该使用 getFirstVisiblePosition()

有什么想法吗?

谢谢

【问题讨论】:

  • 您的列表视图的高度是如何设置的?如果你将它设置为“wrap_content”,它可能会导致一些奇怪的行为,它会在一堆额外的单元格(通常是我的经验中的前几个)上调用 getView 来测量它们。这可能不是你的错误,但值得一看。
  • 如果你在 AdapterView 中使用 getItemAtPosition 而不是通过 Adapter 是否有效?

标签: android onitemclicklistener android-cursorloader


【解决方案1】:

我猜你可能正在使用getView() 方法的convertView 参数来回收视图。使用它可能会导致这里出现问题。请尝试使用替代方法并检查问题是否仍然存在

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多