SetSelection на Spinner на основе rowId
У меня есть Spinner View, который заполняется через SimpleCursorAdapter.
На основе выбора мне нужно сохранить rowid в базе данных записей (позиция не будет работать, потому что вещи могут быть добавлены и удалены из базы данных Spinner).
Это можно сделать, используя spinner.getAdapter().getItemId(pos);
. Но когда я редактирую запись, мне нужно сделать позицию Spinner выбранной, которая связана с этим rowid (в настоящее время).
spinner.setSelection(position);
не будет работать, потому что у меня есть rowid, мне нужен способ найти текущую позицию элемента в текущем spinner на основе rowid в базе данных.
Ответы
Ответ 1
Если вы хотите установить выбор 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"));
Там может быть более быстрый способ сделать это, но это всегда сработало для меня.
Ответ 2
Если у вас возникла идея при создании этого файла, он сделал хеш-таблицу с rowid- > pos при заполнении счетчика, а затем использовал это. Может помочь кому-то, если они ищут.
Ответ 3
Я согласен с Эрихом Дугласом выше :, но я нашел самый быстрый цикл синтаксис, который будет полезен, когда spinner.getCount()
больше от 50 к до 100 тыс..
/* 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);
}
}
Ответ 4
Я думаю, что вместо цикла 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;
}
}
Ответ 5
На первом шаге создайте представление для своего набора данных с помощью объединений и т.д.:
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
Надеюсь, что поможет
Ответ 6
fooobar.com/questions/391801/...
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
Я просто заменил "where" на "on", который требуется для соединения.
теперь у вас есть все элементы с их позициями, связанными с идентификаторами.
Просто присвойте ROW_id setselection()
счетчика
Ответ 7
Почему это трудно, когда вы можете сделать это правильно?
Я обращаюсь к руководству:
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 для этого просветления.:)