我有一个Spinner视图,它通过SimpleCursorAdapter填充。
根据选择我需要在条目数据库中保存 rowid (位置不起作用,因为可以在Spinner数据库中添加和删除内容)。
我可以使用 spinner.getAdapter().getItemId(pos);
来完成此操作。但是当我编辑一个条目时,我需要选择与此rowid相关联的Spinner位置(当前)。
spinner.setSelection(position);
无效,因为我有rowid,我需要一种方法根据数据库中的rowid查找当前微调器中项目的当前位置。 / p>
答案 0 :(得分:16)
如果您要设置由Spinner
支持的CursorAdapter
的选择,您可以遍历Cursor
中的所有项目并查找您想要的项目(假设表中的主键名为“_id”):
Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(new SimpleCursorAdapter(...));
for (int i = 0; i < spinner.getCount(); i++) {
Cursor value = (Cursor) spinner.getItemAtPosition(i);
long id = value.getLong(value.getColumnIndex("_id"));
if (id == rowid) {
spinner.setSelection(i);
}
}
如果您想获取所选项目的rowid,您可以执行类似的操作:
Cursor cursor = (Cursor) spinner.getSelectedItem();
long rowid = cursor.getLong(cursor.getColumnIndex("_id"));
可能有更快捷的方法,但这对我来说总是有效。
答案 1 :(得分:1)
写这个时有一个想法,在填充微调器然后使用它时,用rowid-&gt; pos制作一个哈希表。如果他们正在搜索,可能会帮助别人。
答案 2 :(得分:1)
我同意 Erich Douglass's 之上的answer,但我找到了最快的循环语法,当 spinner.getCount()
大于 50k到100k 。
/* 1 (fastest) */
for (int i = initializer; i >= 0; i--) { ... }
/* 2 */
int limit = calculateLoopLimit();
for (int i = 0; i < limit; i++) { ... }
/* 3 */
Type[] array = getMyArray();
for (Type obj : array) { ... }
/* 4 */
for (int i = 0; i < array.length; i++) { ... }
/* 5 */
for (int i = 0; i < this.var; i++) { ... }
/* 6 */
for (int i = 0; i < obj.size(); i++) { ... }
/* 7 (slowest) */
Iterable<Type> list = getMyList();
for (Type obj : list) { ... }
所以我认为我们可以在这里使用第二个以获得更好的性能:
int spinnerCount = spinner.getCount();
for (int i = 0; i < spinnerCount; i++) {
Cursor value = (Cursor) spinner.getItemAtPosition(i);
long id = value.getLong(value.getColumnIndex("_id"));
if (id == rowid) {
spinner.setSelection(i);
}
}
答案 3 :(得分:1)
我认为代替for循环会更好一段时间,因为当你找到你的项目时,可以打破循环。
int spinnerCount = spinner.getCount();
int i = 0;
while(i++ < spinnerCount) {
Cursor value = (Cursor) spinner.getItemAtPosition(i);
long id = value.getLong(value.getColumnIndex("_id"));
if (id == rowid) {
spinner.setSelection(i);
break;
}
}
答案 4 :(得分:0)
第一步,为您的数据集创建视图,使用连接等:
CREATE VIEW my_view AS
SELECT _id, field FROM my_table
第二步:
CREATE VIEW my_view2 AS
SELECT count(*) AS row_id, q1.*
FROM my_view AS q1
LEFT JOIN my_view AS q2
WHERE q1._id >= q2._id
GROUP BY q1._id
然后简单地说:
SELECT * FROM my_view2
结果:
row_id | _id | field
1 4 XbMCmUBFwb
2 6 Te JMejSaK
3 8 dDGMMiuRuh
4 10 phALAbnq c
5 11 EQQwPKksIj
6 12 PAt tbDnf
7 13 f zUSuhvM
8 14 TIMBgAGhkT
9 15 OOcnjKLLER
通过id获取位置:
SELECT * FROM my_view2 WHERE _id=11
结果:
row_id | _id | field
5 11 EQQwPKksIj
希望有帮助
答案 5 :(得分:0)
https://stackoverflow.com/a/5040748/1206052
dziobas
提供了一个很棒的答案..但我并不感到惊讶,为什么没有人推荐它..只是想在他的答案中做出一些修正..
CREATE VIEW my_view2 AS
SELECT count(*) AS row_id, q1.*
FROM my_view AS q1
LEFT JOIN my_view AS q2
ON (q1._id >= q2._id)
GROUP BY q1._id
我只是将“where”替换为join所需的“on”..
现在你拥有与其ID相关联的所有项目......
只需将ROW_id分配给微调器的setselection()
答案 6 :(得分:-2)
为什么你能以正确的方式做到这一点很难?
我参考手册:
示例代码:
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
int index = spinner.getSelectedItemPosition();
Toast.makeText(getBaseContext(),
"You have selected item : " + index + " which is row " + id,
Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> arg0) {}
});
感谢#android-dev上的evancharlton为此启发。 :)