How can I create a list Array with the cursor data in Android
Asked Answered
E

5

36

How can I create a list Array (the list display First Alphabet when scroll) with the cursor data?

Estimative answered 30/8, 2009 at 14:31 Comment(1)
You want to create a ArrayList with the data of a cursor?Borgerhout
B
69

Go through every element in the Cursor, and add them one by one to the 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));
}

(replace WhateverTypeYouWant with whatever type you want to make a ArrayList of, and WHATEVER_COLUMN_INDEX_YOU_WANT with the column index of the value you want to get from the cursor.)

Borgerhout answered 31/8, 2009 at 16:24 Comment(4)
Hi, The important thing I want to do is display "Fist character" in my List. After I get all data from cursor, I don't know how to convert it to an String[] Array to get "First character". It look something like this char firstLetter = mString[firstVisibleItem].charAt(0);Estimative
Friends: the for loop above is not completly right (condition and increment anre swapped). Use for(mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext()) {}Leveller
This type of loop is kind of awful to read. The solution from @PearsonArtPhoto is way more elegant and easier to read.Lucy
What do you mean by getWhateverTypeYouWant? Is that a real method.Evolution
P
41

One quick correction: the for loop above skips the first element of the cursor. To include the first element, use this:

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();
}
Pamphylia answered 20/7, 2011 at 20:23 Comment(2)
very good point imbrizi. This is a much better way to loop through the elements of the CursorJointress
how to add two or more column value??Reinstate
P
23

Even better than @imbrizi's answer is this:

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

moveToNext() will return false if there isn't anything left, so this reduces the SLOC by a few, and is easier to see.

Even better is to get the column index outside of the loop.

ArrayList<String> mArrayList = new ArrayList<String>();
int columnIndex=mCursor.getColumnIndex(dbAdapter.KEY_NAME)
while(mCursor.moveToNext()) {
     mArrayList.add(mCursor.getString(columnIndex)); //add the item
}
Pivotal answered 20/1, 2014 at 3:19 Comment(2)
The only correct way to iterate through the Cursor. Other two answers are just....wrong :|Jemmy
Except in weird scenarios, you can usually externalize the getColumnIndex outside the loopMn
R
3

This one worked really well for me because I wanted an arraylist of objects:

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();

Just make a POJO MyObject and make sure it has a constructor.

Richel answered 11/9, 2015 at 19:11 Comment(0)
S
2

In Kotlin you can use this 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())
        }
    }
}

and use it:

val listOfIds = cursor.toList { 
    // create item from cursor. For example get id:
    it.getLong(it.getColumnIndex("_id"))
}
Settler answered 17/7, 2018 at 9:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.