Intereting Posts
Как управлять сеансом для пользователя, зарегистрированного в мобильном приложении на PHP? «Bitmap.createScaledBitmap» преобразует 32-битное изображение в 24 бит? Возможно ли для Android-приложения временно отключить «ОК Google»? Как добавить изображение в spinner в Android Использование пользовательского шрифта в android TextView с помощью xml Как добавить .so, .mk и другие собственные файлы в Android Studio? Пользовательский тост на экране Когда использовать Сервис или AsyncTask или Обработчик? Android: удалять связанные приложения файлы из внешнего хранилища в Uninstall? Местоположение SDK не найдено. ANDROID_HOME – создание проекта градиента в затмении на MAC Как я могу динамически создавать элементы меню? Могу ли я использовать jmonkeyengine для Android? Как использовать и тестировать API-интерфейс Android 4.0 в эмуляторе? Android Studio 0.8.2 – Синхронизация проекта Gradle не выполнена Android: GLES20: вызывается нереализованным API OpenGL ES

SetSelection на Spinner на основе rowId

У меня есть Spinner View, который заполняется через SimpleCursorAdapter.

На основе выбора мне нужно сохранить rowid в базе данных входа (позиция не будет работать, потому что вещи могут быть добавлены и удалены из базы данных Spinner).

Это можно сделать, используя spinner.getAdapter().getItemId(pos); , Но когда я редактирую запись, мне нужно сделать позицию Spinner выбранной, которая связана с этим rowid (в настоящее время).

spinner.setSelection(position); Не будет работать, потому что у меня есть rowid, мне нужно найти текущую позицию элемента в текущем spinner на основе rowid в базе данных.

Solutions Collecting From Web of "SetSelection на Spinner на основе rowId"

Если вы хотите установить выбор Spinner поддерживаемый CursorAdapter , вы можете просмотреть все элементы в Cursor и искать нужный (при условии, что первичный ключ в вашей таблице называется «_id»):

 Spinner spinner = (Spinner) findViewById(R.id.spinner); spinner.setAdapter(new SimpleCursorAdapter(...)); for (int i = 0; i < spinner.getCount(); i++) { Cursor value = (Cursor) spinner.getItemAtPosition(i); long id = value.getLong(value.getColumnIndex("_id")); if (id == rowid) { spinner.setSelection(i); } } 

Если вы хотите получить rowid выбранного элемента, вы можете сделать что-то подобное:

 Cursor cursor = (Cursor) spinner.getSelectedItem(); long rowid = cursor.getLong(cursor.getColumnIndex("_id")); 

Возможно, будет более быстрый способ сделать это, но это всегда сработало для меня.

Если у вас возникла идея при написании этого файла, он сделал хеш-таблицу с rowid-> pos при заполнении счетчика, а затем использовал это. Можете помочь кому-то, если они ищут.

Я согласен с вышеизложенным ответом Эриха Дугласа, но я нашел самый быстрый синтаксис цикла, который будет полезен, пока spinner.getCount() будет больше, чем 50k до 100k .

 /* 1 (fastest) */ for (int i = initializer; i >= 0; i--) { ... } /* 2 */ int limit = calculateLoopLimit(); for (int i = 0; i < limit; i++) { ... } /* 3 */ Type[] array = getMyArray(); for (Type obj : array) { ... } /* 4 */ for (int i = 0; i < array.length; i++) { ... } /* 5 */ for (int i = 0; i < this.var; i++) { ... } /* 6 */ for (int i = 0; i < obj.size(); i++) { ... } /* 7 (slowest) */ Iterable<Type> list = getMyList(); for (Type obj : list) { ... } 

Поэтому я думаю, что мы можем использовать здесь секунду для лучшей производительности:

 int spinnerCount = spinner.getCount(); for (int i = 0; i < spinnerCount; i++) { Cursor value = (Cursor) spinner.getItemAtPosition(i); long id = value.getLong(value.getColumnIndex("_id")); if (id == rowid) { spinner.setSelection(i); } } 

Я думаю, что вместо цикла for лучше, потому что, когда вы найдете свой элемент, вы можете сломать цикл.

 int spinnerCount = spinner.getCount(); int i = 0; while(i++ < spinnerCount) { Cursor value = (Cursor) spinner.getItemAtPosition(i); long id = value.getLong(value.getColumnIndex("_id")); if (id == rowid) { spinner.setSelection(i); break; } } 

Первый шаг, создайте представление для своего набора данных, с объединениями и т. Д .:

 CREATE VIEW my_view AS SELECT _id, field FROM my_table 

Второй шаг:

 CREATE VIEW my_view2 AS SELECT count(*) AS row_id, q1.* FROM my_view AS q1 LEFT JOIN my_view AS q2 WHERE q1._id >= q2._id GROUP BY q1._id 

Тогда просто:

 SELECT * FROM my_view2 

Результаты:

 row_id | _id | field 1 4 XbMCmUBFwb 2 6 Te JMejSaK 3 8 dDGMMiuRuh 4 10 phALAbnq c 5 11 EQQwPKksIj 6 12 PAt tbDnf 7 13 f zUSuhvM 8 14 TIMBgAGhkT 9 15 OOcnjKLLER 

Чтобы получить позицию по id:

 SELECT * FROM my_view2 WHERE _id=11 

Результаты:

 row_id | _id | field 5 11 EQQwPKksIj 

Надеюсь, что помощь

https://stackoverflow.com/a/5040748/1206052

dziobas

Дал удивительный ответ. Но я не удивлен, почему никто не рекомендовал его .. просто хочу сделать некоторые исправления в его ответе ..

 CREATE VIEW my_view2 AS SELECT count(*) AS row_id, q1.* FROM my_view AS q1 LEFT JOIN my_view AS q2 ON (q1._id >= q2._id) GROUP BY q1._id 

Я просто заменил «где» на «on», который требуется для соединения.

Теперь у вас есть все элементы с их позициями, связанными с идентификаторами.

Просто назначьте ROW_id параметру setselection()

Почему это трудно, когда вы можете сделать это правильно?

Я имею в виду руководство:

http://d.android.com/reference/android/widget/AdapterView.OnItemSelectedListener.html#onItemSelected%28android.widget.AdapterView%3C?%3E,%20android.view.View,%20int,%20long%29

Пример кода:

 spinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { int index = spinner.getSelectedItemPosition(); Toast.makeText(getBaseContext(), "You have selected item : " + index + " which is row " + id, Toast.LENGTH_SHORT).show(); } public void onNothingSelected(AdapterView<?> arg0) {} }); 

Благодаря evancharlton на # android-dev для этого просветления. 🙂