Intereting Posts
Как получить элементы (findViewById) для макета, который динамически загружается (setView) в диалоговом окне? Android: как получить текущее имя устройства WiFi-direct Создание JavaDocs с плагином Android Gradle Как я могу заставить движок поиска Android двигаться плавно? Как правильно настроить syncAdapter? Ошибка настройки Phonegap Ошибка Кордовы Ошибка создания Платформы Android: как избежать вложенных весов? Точная разница между гравитацией и layout_gravity Использование архитектуры Android? Снижение воздействия приложений на приложения, загружающие контент через смартфон Как изменить размер элемента Java Script для его окна контейнера Возможно ли подключить USB-устройство к устройству Android с помощью adb через терминал? Как прекратить отображение сообщения из Toast, когда приложение закрыто? Получить ключ от HashMap в Android по позиции или индексу Как обнаружить прокрутку влево или вправо в Android?

Заполнение Spinner из базы данных SQLite

Я пытаюсь сделать динамическое падение, которое будет заполнено таблицей 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 выбранного элемента. Мне нужно иметь возможность выбрать один элемент и получить доступ к значению этого элемента в конце. Например, подумайте о выпадающем списке в HTML. Каждый выпадающий выбор имеет собственное скрытое значение, которое вытягивается. Мне нужно, чтобы это значение было скрыто для меня, чтобы я мог узнать, какой идентификатор они выбрали.

Solutions Collecting From Web of "Заполнение Spinner из базы данных SQLite"

Попробуйте использовать SimpleCursorAdapter вместо копирования всех данных вручную в ArrayAdapter .

Это старый вопрос, но первый, который я нашел, когда выяснял эту проблему. Вот подробное объяснение с полным источником, который может сократить некоторые работы.

Ответ действительно заключается в использовании SimpleCursorAdapter, который обрабатывает список строк, но также имеет специальную обработку для сопоставленного поля ID, которое возвращается при выборе строки. Ключом к этой работе является знание двух следующих неясных бит информации:

1) При создании курсора убедитесь, что запрос возвращает поле под названием «_id». Это поле не нужно отображать в любом месте, но его значение будет передано обратно при выборе элемента списка.

2) При создании SimpleCursorAdapter вам нужно предоставить идентификаторы макета TextView, в которые будет помещен текст строки. Если используется андроид, поставляемый макет android.R.layout.simple_spinner_item, то текстовым идентификатором, который вам нужно использовать, является 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 флажок «Заполнение макета с данными» для использования SimpleCursorAdapter