setSelection для Spinner на основе rowId - PullRequest
13 голосов
/ 01 апреля 2010

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

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

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

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

Ответы [ 7 ]

16 голосов
/ 01 апреля 2010

Если вы хотите установить выбор 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"));

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

1 голос
/ 17 марта 2015

Я думаю, что вместо цикла 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;
    }
}
1 голос
/ 27 января 2014

Я согласен с Эрихом Дуглассом выше ответ , но я нашел самый быстрый синтаксис цикла, который будет полезен, в то время как 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);
    }
}
1 голос
/ 01 апреля 2010

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

0 голосов
/ 26 марта 2012

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() счетчика

0 голосов
/ 18 февраля 2011

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

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

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

0 голосов
/ 11 июня 2010

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

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

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 за это освещение :)

...