什么';s项目id的用途';Android ListView适配器中有什么?

什么';s项目id的用途';Android ListView适配器中有什么?,android,listview,position,adapter,Android,Listview,Position,Adapter,(不是特定于ListView,而是特定于适配器) 当我将BaseAdapter子类化时,我一直在实现这一点: @Override public long getItemId(int position) { return position; } 因为我们必须实现这一点。我看不出它有什么用处,我只需要getItem(position),而不需要getItemId(position) 我想知道它是否有任何意义(对Android SDK或其他东西) 是的,an

(不是特定于ListView,而是特定于适配器)

当我将BaseAdapter子类化时,我一直在实现这一点:

    @Override
    public long getItemId(int position) {
        return position; 
    }
因为我们必须实现这一点。我看不出它有什么用处,我只需要getItem(position),而不需要getItemId(position)

我想知道它是否有任何意义(对Android SDK或其他东西)

是的,android调用它将适配器数据集行id映射到您的列表位置


欢迎您挖掘

如果您改为子类ArrayAdapter,则可能不必实现该方法

大多数情况下,我发现该方法对于确定onClick事件期间单击的行非常有用,并将该ID用作传递给下一个活动的意图附加的一部分。

想象一下这种结构: 您有包含以下3条记录的db table Notes:

+----+--------------------------+
|ID |注释文本|
+----+--------------------------+
|43 |注意文字废话|
|67 |注意文本废话废话|
|85 |最后一点|
+----+--------------------------+
您实现了一个适配器来为这些数据提供服务

现在让我们看看在这种情况下位置和项目id是什么 位置-是加载数据集中记录位置的序号。例如,如果您使用
ORDER BY ID ASC
加载该表,则

  • ID为43的记录将具有位置0
  • ID为67的记录将具有位置1
  • ID为85的记录将具有位置2
itemId-是记录的“主键”,您的实现可以返回这样的值

  • ID为43的记录应具有itemId43
  • ID为67的记录应具有itemId67
  • ID为85的记录应具有itemId85
Android标准适配器中的位置和itemId 阵列适配器/简单适配器 在
ArrayAdapter
simpledapter
中,位置和项目ID是相同的:

public long getItemId(int position) {
    return position; 
}
SimpleCursorAdapter(以及从CursorAdapter继承的所有类型) 在SimpleCursorAdapter和CursorAdapter的所有后代中,itemId是\u id列中的一个值:

public long getItemId(int position) {
    if (mDataValid && mCursor != null) {
        if (mCursor.moveToPosition(position)) {
            return mCursor.getLong(mRowIDColumn);
        } else {
            return 0;
        }
    } else {
        return 0;
    }
}

在@Reno编写时,它允许您将视图中的行映射到数据集元素


这样做的目的之一是允许ListView跟踪所选的项目,即使列表中的位置已更改或基础数据已更新

拥有稳定的项目ID可能有很多原因。无法提供默认实现,因为它取决于适配器中存储的对象类型

Android有一个检查,以确保项目ID仅在稳定时使用,即子类已正确覆盖
getItemId
;必须重写才能返回true

我遇到了几个原因:

  • 的方法
    onItemClick(AdapterView父对象、视图、int位置、长id)
    也发送
    long id

  • 方法
    仅当选择模式未设置为choice\u mode\u NONE且适配器具有稳定的ID时,结果才有效。


回答“因为你必须实现它”:你不必必须如果你不使用这些功能,就没有必要了。但是如果您这样做了,请不要忘记覆盖
布尔hastTableId()

几乎,但不完全。。。如果列表中附加了标题视图,则数组/SimpleAdapter中的位置和itemId不相同!在这些情况下,请使用行id而不是位置,这样您就不需要从列表位置“计算”实际项目行。@dhaval可能是因为这回答了id是什么,而不是它们的用途。@dhaval Yes Simas的注释是正确的。这个答案解释了什么是ID,但不是为什么我必须实现getItemId。有时我根本不使用getItemId,因为getItem通常返回一个已经包含该id的“item”。