2010-02-03 200 views
7

我試圖做一個動態的下拉,將由SQLite表填充。我有一個Cursor對象,我可以從中獲取所需的數據。我已經能夠做到把值裝載到下拉用下面的代碼:從SQLite數據庫填充微調器Android

Spinner s = (Spinner) findViewById(R.id.spinner); 
    ArrayAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    s.setAdapter(adapter); 

    try{ 
     Cursor cursor = getAccounts(); 
     int accountnameIndex = cursor.getColumnIndexOrThrow(ACCOUNT_NAME); 
     if(cursor.moveToFirst()){ 
      do{ 
       adapter.add(cursor.getString(accountnameIndex)); 
      } while(cursor.moveToNext()); 
     } 
    } finally { 
     MintLink.close(); 
    } 

我的問題是,我需要從下拉菜單中選擇也包含所選項目的ROWID。我需要能夠選擇一個項目並訪問後端項目的值。例如,想一想HTML中的下拉菜單。每個下拉選擇都有它自己的隱藏值被拉。我需要隱藏這個值才能讓我知道他們選擇了哪個ID。

+0

[你可以在這裏看到](http://samir-mangroliya.blogspot.in/2012/09/android-populate-spinner-from-sqlite.html) – 2012-10-17 06:16:50

回答

5

嘗試使用SimpleCursorAdapter而不是手動將所有數據複製到ArrayAdapter

+2

雖然這簡而言之就是答案。實現SimpleCursorAdapter與Spinner一起工作的細節是什麼?我是否需要抽象我自己的ViewBinder,或者我可以直接使用SimpleCursorAdapter與Spinner。 – crv 2010-02-04 22:30:22

+0

在摘要中沒有辦法回答這個問題。我可以指點你一些示例代碼,如果它有幫助(雖然它從ContentProvider,而不是SQLite獲得它的光標):http://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Spinners/ – CommonsWare 2010-02-05 01:20:07

+1

爲什麼現在是否獲得'SimpleCursorAdapter'棄用警告。現在使用什麼 – DevZer0 2013-08-11 07:29:54

15

用法這是一個老問題,但第一個搞清楚這個問題時,我發現。這裏有一個詳細的解釋,全面的來源可能會削減一些legwork。

答案是確實使用它處理字符串列表的SimpleCursorAdapter,但也有在選擇的行獲取返回匹配ID字段進行特殊處理。以使這項工作的關鍵是要知道的信息,以下兩個不起眼位:

1)在創建光標確保查詢返回名爲「_id」的字段。這個字段不需要顯示在任何地方,但是當選擇列表項時它的值將被傳回。

2)創建SimpleCursorAdapter時,需要提供將放置行文本的TextView佈局ID。如果使用android提供的佈局android.R.layout.simple_spinner_item,則需要使用的文本ID是android.R.id.text1。

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <Spinner 
     android:id="@+id/spinner1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     ></Spinner> 
</RelativeLayout> 

活動代碼:

public class TesterActivity extends Activity { 
public Context mContext; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // just for this example: 
    // create database table with an id field and a text field and add some data 
    class MyDBHelper extends SQLiteOpenHelper { 
     public MyDBHelper(Context context) { 
      super(context, "someDB", null, 2); 
     } 
     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL("CREATE TABLE someTable (someIDF INTEGER, someTextF TEXT)"); 
     } 
     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS someTable"); 
      onCreate(db); 
      db.execSQL("INSERT INTO someTable (someIDF, someTextF) VALUES (54, 'Some text')"); 
      db.execSQL("INSERT INTO someTable (someIDF, someTextF) VALUES (99, 'Some more text')"); 
      db.execSQL("INSERT INTO someTable (someIDF, someTextF) VALUES (173, 'Even more text')"); 
     } 
    } 
    SQLiteDatabase db = new MyDBHelper(this).getWritableDatabase(); 

    // get a cursor from the database with an "_id" field 
    Cursor c = db.rawQuery("SELECT someIDF AS _id, someTextF FROM someTable", null); 

    // make an adapter from the cursor 
    String[] from = new String[] {"someTextF"}; 
    int[] to = new int[] {android.R.id.text1}; 
    SimpleCursorAdapter sca = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, c, from, to); 

    // set layout for activated adapter 
    sca.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    // get xml file spinner and set adapter 
    Spinner spin = (Spinner) this.findViewById(R.id.spinner1); 
    spin.setAdapter(sca); 

    // set spinner listener to display the selected item id 
    mContext = this; 
    spin.setOnItemSelectedListener(new OnItemSelectedListener() { 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id){ 
      Toast.makeText(mContext, "Selected ID=" + id, Toast.LENGTH_LONG).show(); 
     } 
     public void onNothingSelected(AdapterView<?> parent) {} 
     }); 
    } 
} 
+0

工程在我的項目,但只有敬酒。如何將ID保存到sqlite @MindSpiker? – 2013-01-15 09:27:57

3

下面是用裝載機和遊標另一個答案。

在活動/片斷創建(據說片段/活動必須實現LoaderManager.LoaderCallbacks<Cursor>):

final Spinner spinner = (Spinner) findViewById(R.id.spinner); 
mAdapter = new MyCursorAdapter(getActivity()); 
spinner.setAdapter(mAdapter); 
getLoaderManager().initLoader(SOME_INT_CONSTANT, null, this); 

在你的活動/片段:

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    return new MyCursorLoader(getActivity(), args); 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mAdapter.swapCursor(data); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    mAdapter.swapCursor(null); 
} 

這裏的光標適配器:

class MyCursorAdapter extends CursorAdapter { 
    class ViewsHolder { 
     TextView text1, text2; 
    } 

    public MyCursorAdapter(Context context, Bundle args) { 
     super(context, null, false); 
     // do something with args 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = LayoutInflater.from(context).inflate(R.layout.your_item_layout, parent, false); 
     ViewsHolder holder = new ViewsHolder(); 
     holder.text1 = (TextView) v.findViewById(R.id.text1); 
     holder.text2 = (TextView) v.findViewById(R.id.text2); 
     v.setTag(holder); 
     return v; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ViewsHolder holder = (ViewsHolder) view.getTag(); 
     String text1 = cursor.getString(cursor.getColumnIndex(KEY_TEXT1)); 
     String text2 = cursor.getString(cursor.getColumnIndex(KEY_TEXT2)); 
     holder.text1.setText(text1); 
     holder.text2.setText(text2); 
    } 
} 

這裏是光標加載器:

public class MyCursorLoader extends CursorLoader { 
    private final YourSQLiteDbAdapter mHelper; 

    public MyCursorLoader(Context context) { 
     super(context); 
     mHelper = new YourSQLiteDbAdapter(context); 
     mHelper.openReadOnly(); 
    } 

    @Override 
    public Cursor loadInBackground() { 
     return mHelper.selectYourDataAsACursor(); 
    } 

    @Override 
    protected void onStopLoading() { 
     super.onStopLoading(); 
     mHelper.close(); 
    } 
} 

使用此您將獲得:

  • 沒有使用過時的API的
  • 使用Loader API的
  • 定義適配器/佈局
  • 視圖循環
  • API級別4向後兼容(通過支持庫)
  • 後臺線程數據加載