2010-04-01 61 views
13

我有一個通過SimpleCursorAdapter填充的Spinner視圖。基於rowId的Spinner setSelection

根據選擇,我需要將rowid保存在條目數據庫中(位置不起作用,因爲可以從Spinner數據庫添加和刪除所有東西)。

這個我可以通過使用spinner.getAdapter().getItemId(pos);。但是當我編輯一個條目時,我需要選擇與此rowid(當前)關聯的Spinner位置。

spinner.setSelection(position);不會起作用,因爲我有rowid的,我需要一種方法來查找當前微調基於數據庫的ROWID項目的當前位置。

+0

我已更新答案,請檢查它。 – 2014-01-27 08:17:16

回答

1

寫了這個想法時,有一個想法,當填充微調器,然後使用它時,用rowid-> pos做了一個散列表。如果他們正在尋找,可以幫助他人。

16

如果你想設置一個CursorAdapter支持的Spinner多數民衆贊成的選擇,你可以通過在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")); 

有可能是一個更快的方式做到這一點,但總是工作了我。

+0

感謝您的回答! – awiden 2010-04-02 09:00:21

+1

不要忘記管理這些遊標,要麼自己關閉它們,要麼讓android使用'startManagingCursor'來實現,省去我剛纔的頭痛。 – Timbermar 2011-02-05 23:32:57

+0

你在第6行錯過了')'。編譯器說'')'expected' – yuttadhammo 2011-09-02 12:09:30

-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) {} 
    }); 

由於evancharlton上#機器人-dev的這個啓示。 :)

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 

希望能夠幫助

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 

我剛剛更換「其中」與「上」即由加入需要..

現在u必須全部與有ID的相關自己的立場的項目..

剛分配到ROW_ID紡絲器的setselection()

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); 
    } 
} 
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; 
    } 
}