Android ListView适配器中item-id的用途是什么?

Ran*_*ku' 12 android listview position adapter

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

当我继承BaseAdapter时,我一直在实现这个:

    @Override
    public long getItemId(int position) {
        return position; 
    }
Run Code Online (Sandbox Code Playgroud)

因为必须实现这一点.我没有看到任何使用它,我只需要getItem(位置),而不是getItemId(位置).

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

Gra*_*tei 31

想象一下这个结构:

你有db表注释这样的3条记录:

+----+--------------------------+
| ID | Note Text                |
+----+--------------------------+
| 43 | Note text blah blah      |
| 67 | Note text blah blah blah |
| 85 | Last note                |
+----+--------------------------+
Run Code Online (Sandbox Code Playgroud)

并实现适配器来提供此数据.

现在让我们看看在这种情况下什么位置和项目ID

position - 是已加载数据集中记录位置的序数.例如,如果您使用ORDER BY ID ASC,那么加载该表

  • ID 43的记录将有0位,
  • ID为67的记录将具有位置1,
  • ID为85的记录将具有位置2

itemId - 是记录的"主键",您的实现可以返回这些值

  • ID为43的记录应该有itemId 43,
  • ID为67的记录应该有itemId 67,
  • ID为85的记录应该有itemId 85

Android标准适配器中的position和itemId

ArrayAdapter/SimpleAdapter

in ArrayAdapterSimpleAdapterposition和itemId是一回事:

public long getItemId(int position) {
    return position; 
}
Run Code Online (Sandbox Code Playgroud)

SimpleCursorAdapter(以及从CursorAdapter继承的所有类型)

在SimpleCursorAdapter和CursorAdapter的所有后代中,itemId是来自_id列的值:

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

  • 几乎,但不完全......如果标题视图附加到列表中,position和itemId在Array/SimpleAdapter中是不一样的!在这些情况下,使用行id而不是位置,因此您无需从列表位置"计算"实际项目行. (3认同)

ved*_*ant 4

拥有稳定的物品 ID 的原因可能有很多。无法给出默认实现,因为它取决于存储在适配器中的对象类型。

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

我遇到的几个原因:

  • AdapterView.OnItemClickListener的方法onItemClick(AdapterView<?> parent, View view, int position, long id)也发送long id

  • getCheckedItemIds方法​The result is only valid if the choice mode has not been set to CHOICE_MODE_NONE and the adapter has stable IDs.

回复“因为必须实现这个”:你不必如果你不使用这些功能,那就没有必要。boolean hasStableIds()但如果你这样做了,也不要忘记覆盖。