什么';s项目id的用途';Android ListView适配器中有什么?
(不是特定于ListView,而是特定于适配器) 当我将BaseAdapter子类化时,我一直在实现这一点:什么';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
@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
- ID为43的记录应具有itemId43
- ID为67的记录应具有itemId67
- ID为85的记录应具有itemId85
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”。