Как вставить дополнительные элементы в SimpleCursorAdapter или Cursor для Spinner?

Если запрошенный URI является https, если у вас есть ресурсы на странице (изображения, таблицы стилей, файлы JavaScript и т. д.), которые запрашиваются с помощью схемы http, некоторые браузеры могут блокировать их, поскольку они считаются небезопасными , Вы можете обойти это для каждого браузера, но у вас также есть альтернативы в вашем коде:

  1. Используйте https для запроса всего или, по крайней мере, для соответствия схемам.
  2. Использовать //, чтобы указать схему. Браузер будет соответствовать схеме с URI запроса. Например: <link rel="stylesheet" type="text/css" href="//example.com/path/to.css">
29
задан elto 19 July 2011 в 22:39
поделиться

4 ответа

Это метод, который я попробовал.

MatrixCursor m = new MatrixCursor(c.getColumnNames());
Cursor c = DBHelper.rawQuery("Select values from your_table");
MatrixCursor m = new MatrixCursor(c.getColumnNames());

//Use MatrixCursor#addRow here to add before the original cursor

while (c.moveToNext()) {
    //Use MatrixCursor#addRow here to add before the original row
    DBHelper.insertRow(c, m);
    //Use MatrixCursor#addRow here to add after the original row

}
//Use MatrixCursor#addRow here to add after the original cursor

m.addRow(new String[]{col1Val, col2Val, col3Val,..., //to match the number of columns needed});

DBHelper.insertRow ()

public final static void insertRow(Cursor from, MatrixCursor to) {
final String columns[] = from.getColumnNames(), values[] = new String[columns.length];
    final int size = columns.length;

    for (int i = 0; i < size; i++) {
        values[i] = getStringFromColumn(from, columns[i]);
    }
    to.addRow(values);
}

С помощью этого метода вы можете добавить любое количество строк в любом месте вашего курсора. Даже если он не использует CursorWrapper, его можно использовать с CursorAdapters или SimpleCursorAdapters.

2
ответ дан syy 19 July 2011 в 22:39
поделиться

Вы можете использовать комбинацию MergeCursor и MatrixCursor с вашей БД cursor следующим образом:

MatrixCursor extras = new MatrixCursor(new String[] { "_id", "title" });
extras.addRow(new String[] { "-1", "New Template" });
extras.addRow(new String[] { "-2", "Empty Template" });
Cursor[] cursors = { extras, cursor };
Cursor extendedCursor = new MergeCursor(cursors);
89
ответ дан naktinis 19 July 2011 в 22:39
поделиться

Я попробовал решение, предоставленное @naktinis, но результат оказался не таким, как я ожидал. Чего я сам хотел добиться в качестве адаптера, в который можно добавлять новые элементы вверху (индекс 0). Однако, учитывая данное решение, новые элементы действительно были добавлены сверху, но только в КОНЕЦ MatrixCursor. Другими словами, когда я динамически добавлял строки в MatrixCursor «extras», я получал что-то вроде этого: "строка 2

  • " дополнительные "строки 3
  • " курсор "строка 1
  • " курсор "строка 2
  • «курсор», строка 3.
    • Однако то, чего я действительно хотел добиться, было примерно так:

      • «дополнительные» строки 3
      • «дополнительные» строки 2
      • «дополнительная» строка 1
      • «курсор» строка 1
      • «курсор» строка 2
      • «курсор», строка 3.

      Другими словами, самые последние элементы входят вверху (индекс 0).

      Мне удалось достичь этого вручную, выполнив следующее. Обратите внимание, что я не включил никакой логики для обработки динамического удаления элементов из адаптера.

      private class CollectionAdapter extends ArrayAdapter<String> {
      
        /**
         * This is the position which getItem uses to decide whether to fetch data from the
         * DB cursor or directly from the Adapter's underlying array. Specifically, any item
         * at a position lower than this offset has been added to the top of the adapter
         * dynamically.
         */
        private int mCursorOffset;
      
        /**
         * This is a SQLite cursor returned by a call to db.query(...).
         */
        private Cursor mCursor;
      
        /**
         * This stores the initial result returned by cursor.getCount().
         */
        private int mCachedCursorCount;
      
        public Adapter(Context context, Cursor cursor) {
          super(context, R.layout.collection_item);
          mCursor = cursor;
          mCursorOffset = 0;
          mCachedCursorCount = -1;
        }
      
        public void add(String item) {
          insert(item, 0);
          mCursorOffset = mCursorOffset + 1;
          notifyDataSetChanged();
        }
      
        @Override
        public String getItem(int position) {
          // return the item directly from underlying array if it was added dynamically.
          if (position < mCursorOffset) {
            return super.getItem(position);
          }
      
          // try to load a row from the cursor.
          if (!mCursor.moveToPosition(position - mCursorOffset)) {
            Log.d(TAG, "Failed to move cursor to position " + (position - mCursorOffset));
            return null; // this shouldn't happen.
          }
          return mCursor.getString(INDEX_COLLECTION_DATA);   
        }
      
        @Override
        public int getCount() {
          if (mCachedCursorCount == -1) {
            mCachedCursorCount = mCursor.getCount();
          }
          return mCursorOffset + mCachedCursorCount;
        }
      }
      
    2
    ответ дан Daniel Gabriele 19 July 2011 в 22:39
    поделиться

    Я нашел некоторую информацию о добавлении элемента в спиннер с SimpleCursorAdapter: http://groups.google.com/group/android-developers/browse_thread/thread/4123868e02fc9172

    0
    ответ дан Tautvydas 19 July 2011 в 22:39
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: