2010-02-03 189 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向后兼容(通过支持库)
  • 后台线程数据加载