12

我有一个通过 SimpleCursorAdapter 填充的微调器视图。

根据选择,我需要将rowid保存在条目数据库中(位置不起作用,因为可以从 Spinner 数据库中添加和删除内容)。

我可以通过使用spinner.getAdapter().getItemId(pos);. 但是当我编辑一个条目时,我需要选择与此 rowid 关联的 Spinner 位置(当前)。

spinner.setSelection(position);将无法工作,因为我有 rowid,我需要一种方法来根据数据库中的 rowid 在当前微调器中找到项目的当前位置。

4

7 回答 7

15

如果要设置Spinner由 a 支持的 thats的选择CursorAdapter,您可以遍历 a 中的所有项目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"));

可能有一种更快的方法可以做到这一点,但这对我来说总是有效的。

于 2010-04-01T14:16:36.720 回答
1

写这篇文章时有一个想法,在填充微调器时使用 rowid->pos 制作了一个哈希表,然后使用它。如果他们正在搜索,可能会帮助某人。

于 2010-04-01T11:00:26.723 回答
1

我同意Erich Douglass 的上述回答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);
    }
}
于 2014-01-27T08:14:52.897 回答
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;
    }
}
于 2015-03-17T20:39:04.180 回答
0

https://stackoverflow.com/a/5040748/1206052

焦巴斯

提供了一个很棒的答案..但我并不惊讶为什么没有人推荐它..只是想在他的答案中做一些更正..

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

我只是用加入所需的“on”替换了“where”。

现在你有所有的项目,他们的位置与那里的 ID 相关联..

只需将 ROW_id 分配给setselection() 微调器

于 2012-03-26T09:34:10.780 回答
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

希望有所帮助

于 2011-02-18T11:30:09.913 回答
-2

当你能以正确的方式做到这一点时,为什么要以艰难的方式去做呢?

我参考手册:

http://d.android.com/reference/android/widget/AdapterView.OnItemSelectedListener.html#onItemSelected%28android.widget.AdapterView%3C?%3E,%20android.view.View,%20int,%20long%29

示例代码:

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 的启发。:)

于 2010-06-10T20:05:12.790 回答