web-dev-qa-db-fra.com

Comment puis-je créer un tableau de liste avec les données du curseur dans Android

Comment puis-je créer un tableau de liste (la liste affiche le premier alphabet lors du défilement) avec les données du curseur?

34
Dennie

Parcourez chaque élément du Cursor et ajoutez-les un par un au ArrayList.

ArrayList<WhateverTypeYouWant> mArrayList = new ArrayList<WhateverTypeYouWant>();
for(mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext()) {
    // The Cursor is now set to the right position
    mArrayList.add(mCursor.getWhateverTypeYouWant(WHATEVER_COLUMN_INDEX_YOU_WANT));
}

(remplacez WhateverTypeYouWant par le type dont vous voulez faire un ArrayList et WHATEVER_COLUMN_INDEX_YOU_WANT avec l'index de colonne de la valeur que vous souhaitez obtenir du curseur.)

66
Isaac Waller

Une correction rapide: la boucle for ci-dessus saute le premier élément du curseur. Pour inclure le premier élément, utilisez ceci:

ArrayList<String> mArrayList = new ArrayList<String>();
mCursor.moveToFirst();
while(!mCursor.isAfterLast()) {
     mArrayList.add(mCursor.getString(mCursor.getColumnIndex(dbAdapter.KEY_NAME))); //add the item
     mCursor.moveToNext();
}
40
imbrizi

Encore mieux que la réponse de @ imbrizi est la suivante:

ArrayList<String> mArrayList = new ArrayList<String>();
while(mCursor.moveToNext()) {
     mArrayList.add(mCursor.getString(mCursor.getColumnIndex(dbAdapter.KEY_NAME))); //add the item
}

moveToNext() renverra false s'il ne reste rien, ce qui réduit le SLOC de quelques-uns et est plus facile à voir.

Encore mieux est d'obtenir l'index de colonne en dehors de la boucle.

ArrayList<String> mArrayList = new ArrayList<String>();
int columnIndex=mCursor.getColumnIndex(dbAdapter.KEY_NAME)
while(mCursor.moveToNext()) {
     mArrayList.add(mCursor.getString(columnIndex)); //add the item
}
22
PearsonArtPhoto

Celui-ci a très bien fonctionné pour moi car je voulais une liste d'objets:

List<MyObject> myList = new ArrayList<String>();
Cursor c = ...

while(c.moveToNext()) {
    myList.add(new MyObject(cursor.getInt(cursor.getColumnIndex("_id")), cursor.getString(cursor.getColumnIndex("column1")), cursor.getInt(cursor.getColumnIndex("column2")));        
}
c.close();

Créez simplement un POJO MyObject et assurez-vous qu'il a un constructeur.

3
Micro

Dans Kotlin, vous pouvez utiliser cette extension:

fun <T> Cursor.toList(block: (Cursor) -> T) : List<T> {
    return mutableListOf<T>().also { list ->
        if (moveToFirst()) {
            do {
                list.add(block.invoke(this))
            } while (moveToNext())
        }
    }
}

et l'utiliser:

val listOfIds = cursor.toList { 
    // create item from cursor. For example get id:
    it.getLong(it.getColumnIndex("_id"))
}
1
Rafols