SQLiteデータベースAndroidからのスピナーの居住者
質問
SQLiteテーブルで記入される動的なドロップダウンを作ろうとしています。必要なデータをプルできるカーソルオブジェクトがあります。以下のコードを使用して、値をドロップダウンにロードすることを達成できました。
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も含むためにドロップダウンからのAの選択が必要だということです。 1つのアイテムを選択し、バックエンドでそのアイテムの値にアクセスできる必要があります。たとえば、HTMLのドロップダウンを考えてください。各ドロップダウンの選択には、引っ張られる独自の隠された価値があります。私は、彼らが選択したIDを知ることを許可するために、私のためにこの値を隠す必要があります。
解決
を使用してみてください SimpleCursorAdapter
すべてのデータを手作業でコピーする代わりに ArrayAdapter
.
他のヒント
これは古い質問ですが、この問題を把握するときに最初に見つけた質問です。以下は、いくつかのレッグワークをカットする可能性のある完全なソースを使用した詳細な説明です。
答えは、実際に、文字列のリストを処理するが、行が選択されたときに返される一致したIDフィールドの特別な取り扱いもあるSimpleCursoradapterを使用することです。この作業を行うための鍵は、2つの不明瞭な情報を知ることです。
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) {}
});
}
}
ローダーとカーソルの別の答えは次のとおりです。
アクティビティ/フラグメント作成で 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の使用はありません
- ローダーAPIの使用
- カスタマイズされたアダプター /レイアウト
- リサイクルを表示します
- APIレベル4後方互換(サポートLIBを介して)
- バックグラウンドスレッドデータの読み込み
データバインディングの例はここにあります。
http://developer.android.com/guide/topics/ui/binding.html
「レイアウトにデータを入力する」セクションを確認してください。 SimpleCursorAdapter