36

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

1
  • 2
    You want to create a ArrayList with the data of a cursor? Commented Aug 31, 2009 at 16:20

5 Answers 5

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.)

Sign up to request clarification or add additional context in comments.

4 Comments

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);
Friends: the for loop above is not completly right (condition and increment anre swapped). Use for(mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext()) {}
This type of loop is kind of awful to read. The solution from @PearsonArtPhoto is way more elegant and easier to read.
What do you mean by getWhateverTypeYouWant? Is that a real method.
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();
}

2 Comments

very good point imbrizi. This is a much better way to loop through the elements of the Cursor
how to add two or more column value??
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
}

2 Comments

The only correct way to iterate through the Cursor. Other two answers are just....wrong :|
Except in weird scenarios, you can usually externalize the getColumnIndex outside the loop
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.

Comments

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"))
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.