7

SQLite テーブルで埋められる動的ドロップダウンを作成しようとしています。必要なデータを取得できる Cursor オブジェクトがあります。以下のコードを使用して、値をドロップダウンにロードすることができました。

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 も含める必要があることです。1 つのアイテムを選択し、バックエンドでそのアイテムの値にアクセスできる必要があります。たとえば、HTML のドロップダウンを考えてみてください。各ドロップダウン選択には、プルされる独自の非表示の値があります。彼らがどのIDを選択したかを知るために、この値を非表示にする必要があります。

4

4 に答える 4

15

これは古い質問ですが、この問題を理解したときに最初に見つけた質問です。これは、いくつかの面倒な作業を削減する可能性のある完全なソースを含む詳細な説明です.

答えは実際には、文字列のリストを処理するだけでなく、行が選択されたときに返される一致した 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) {}
        });
    }
}
于 2012-06-26T22:20:07.017 に答える
5

SimpleCursorAdapterすべてのデータを手動で にコピーする代わりに、 を使用してみてくださいArrayAdapter

于 2010-02-04T00:56:54.770 に答える
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 を使用しない
  • ローダー API の使用
  • カスタマイズされたアダプター/レイアウト
  • リサイクルを見る
  • API レベル 4 下位互換性 (サポート ライブラリ経由)
  • バックグラウンド スレッド データの読み込み
于 2014-03-29T13:20:44.433 に答える
0

データバインディングの例はここにあります。

http://developer.android.com/guide/topics/ui/binding.html

の使用法については、「レイアウトへのデータの入力」セクションを確認してください。SimpleCursorAdapter

于 2010-10-14T19:43:48.987 に答える