Как реализовать MatrixCursor для Spinner?
У меня есть SQLite
запрос, который возвращает Cursor
, Я хочу добавить несколько дополнительных строк в Cursor
путем реализации MatrixCursor
(чтобы сохранить первый элемент реальных данных от автоматически выбранных при нажатии). Затем я хочу сопоставить их с SimpleCursorAdapter
, Я продолжал читать сообщения (и коды), но все еще неясен для меня, как кодировать его в мой существующий код, указанный ниже.
Cursor cursor = myDB.query(DATABASE_TABLE_NAME, resultColumns, whereClause,
whereArgs, null, null, null, null);
// Create Spinner View object from layout resource
Spinner spinner = (Spinner) findViewById(R.id.spinner);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_spinner_item, // Use a template
// that displays a
// text view
cursor, // Give the cursor to the adapter
new String[] {"ename"}, // Map the NAME column in the
// people database to...
new int[] {android.R.id.text1});
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
1 ответ
Если вы хотите построить MatrixCursor
из простого Cursor
вам придется проанализировать весь начальный Cursor
и добавьте нужные строки:
//...
MatrixCursor mc = new MatrixCursor(resultColumns);
// add extra rows, this will probably not work if you want to insert them
// between the initial cursor rows because of the _id column that need autoincrement values
mc.addRow(new Object[] { new Long(-2), "Extra name1" });
mc.addRow(new Object[] { new Long(-1), "Extra name2" });
// I don't know what your cursor holds, I assumed you have the _id column(long value)
// and a name(String value)
int size = cursor.getCount();
for (int i = 0; i < size; i++) {
cursor.moveToPosition(i);
mc.addRow(new Object[] {
cursor.getLong(cursor.getColumnIndex(/*the _id column*/)),
cursor.getString(cursor.getColumnIndex(/* the name column(ename?!?)*/)) });
}
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_spinner_item, mc, new String[] {"ename"}, new int[] {android.R.id.text1});
//...
Если вы делаете это просто, чтобы избежать OnItemSelectedListener
от стрельбы, когда Spinner
показано, может быть, вы могли бы иметь другой подход. Например, в вашем слушателе:
//boolean status = true; flag in MyOnItemSelectedListener
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
if (status) {
status = false;// this is the first listener trigger so you probably want to ignore it
return;
}
// do stuff here
}
Примечание: я не знаю, насколько хорошо это решение выше. Если вы посмотрите, вероятно, есть гораздо лучшее решение для этого Spinner
связанная проблема.