Я попробовал решение, предоставленное @naktinis, но результат оказался не таким, как я ожидал. Чего я сам хотел добиться в качестве адаптера, в который можно добавлять новые элементы вверху (индекс 0). Однако, учитывая данное решение, новые элементы действительно были добавлены сверху, но только в КОНЕЦ MatrixCursor. Другими словами, когда я динамически добавлял строки в MatrixCursor «extras», я получал что-то вроде этого: "строка 2
Однако то, чего я действительно хотел добиться, было примерно так:
Другими словами, самые последние элементы входят вверху (индекс 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;
}
}
Возможно, самый простой/короткий путь:
function $(id) { return document.getElementById(id); };
Вот кое-что, что я использую в моей собственной библиотеке. DOM
- это класс, а $
- это функция, которая является сокращенной реализацией функции getElementById
:
function DOM()
{
this.$ = function(elementIDs)
{
var el;
// If an array of element names is passed.
if (arguments.length > 1)
{
var elements = [];
var length = arguments.length;
for (var i = 0; i < length; i++)
{
// Call this function recursively for each passed parameter.
elements.push(this.$(arguments[i]));
}
return elements;
}
// If a single element name is passed.
if (typeof(elementIDs) == "string")
{
el = document.getElementById(elementIDs);
}
return el;
}
}
Использование:
var el = new DOM().$("elementID");
Вы можете присвоить ей псевдоним элемент окна верхнего уровня.
Когда вы видели функцию $ (), вероятно, это была какая-то библиотека, такая как jQuery или Prototype. Функция $ не является псевдонимом для document.getElementById, а является оболочкой, которая расширяет функциональные возможности функции.
Чтобы создать свою собственную оболочку, вы можете написать функцию «псевдоним»:
var alias = document.getElemenyById;
или
function alias(id) { return document.getElementById(id); }
Но на самом деле, я бы использовал одну из доступных библиотек, например jQuery или Prototype.
function $( s ) {
return document.getElementById( s ) ? document.getElementById( s ) : "";
}
$( "myId" );
Предполагается, что вы хотите использовать только функцию доллара (селектор) для получения идентификатора. Я не проверял это, но он должен работать.
В последний раз, когда я смотрел на ядро jQuery, он принимал строку в качестве аргумента, а затем использовал регулярное выражение, чтобы определить, что это за селектор.
facebook's connect-js делает следующее в src/core/prelude.js:
if (!window.FB) {
FB = {
// ...
$: function(id) {
return document.getElementById(id);
}
// ...
}
}
Затем, чтобы использовать его, они делают:
FB.$('name-of-id');
Начальный блок создает глобальный объект FB. Они используют этот объект, FB, в качестве пространства имен и определяют в нем все свои объекты, свойства и функции. Таким образом, он будет работать с другим кодом JavaScript до тех пор, пока этот другой код не использует глобальный объект FB.