Comment puis-je créer une liste tableau avec les données de curseur dans Android
-
20-09-2019 - |
Question
Comment puis-je créer une liste Array (l'affichage de la liste Alphabet lorsque défilement) avec les données du curseur?
La solution
Passez par tous les éléments du Cursor
, et les ajouter un par un à l'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
avec ce type que vous voulez faire un ArrayList
de et WHATEVER_COLUMN_INDEX_YOU_WANT
avec l'indice de colonne de la valeur que vous voulez obtenir du curseur.)
Autres conseils
Une correction rapide: la boucle saute au-dessus du premier élément de 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();
}
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()
retourne false s'il n'y a rien à gauche, donc ce qui réduit la SLOC par 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
}
Celui-ci a vraiment bien pour moi parce que je voulais un ArrayList 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();
Il suffit de faire un MyObject
POJO et assurez-vous qu'il a un constructeur.
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 de l'utiliser:
val listOfIds = cursor.toList {
// create item from cursor. For example get id:
it.getLong(it.getColumnIndex("_id"))
}