如何使用光标数据创建列表数组(滚动时列表显示第一个字母)?
答案 0 :(得分:66)
浏览Cursor
中的每个元素,然后将它们逐个添加到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));
}
(将WhateverTypeYouWant
替换为您希望生成ArrayList
的任何类型,WHATEVER_COLUMN_INDEX_YOU_WANT
替换为您希望从游标获取的值的列索引。)
答案 1 :(得分:40)
一个快速修正:上面的for循环跳过光标的第一个元素。 要包含第一个元素,请使用:
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 :(得分:22)
甚至比@ imbrizi更好的答案是:
ArrayList<String> mArrayList = new ArrayList<String>();
while(mCursor.moveToNext()) {
mArrayList.add(mCursor.getString(mCursor.getColumnIndex(dbAdapter.KEY_NAME))); //add the item
}
如果没有任何内容, moveToNext()
将返回false,因此这会使SLOC减少一些,并且更容易看到。
更好的方法是将列索引置于循环之外。
ArrayList<String> mArrayList = new ArrayList<String>();
int columnIndex=mCursor.getColumnIndex(dbAdapter.KEY_NAME)
while(mCursor.moveToNext()) {
mArrayList.add(mCursor.getString(columnIndex)); //add the item
}
答案 3 :(得分:3)
这个对我很有用,因为我想要一个对象的arraylist:
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();
只需制作一个POJO MyObject
,并确保它有一个构造函数。
答案 4 :(得分:1)
在Kotlin中,您可以使用以下扩展名:
fun <T> Cursor.toList(block: (Cursor) -> T) : List<T> {
return mutableListOf<T>().also { list ->
if (moveToFirst()) {
do {
list.add(block.invoke(this))
} while (moveToNext())
}
}
}
并使用它:
val listOfIds = cursor.toList {
// create item from cursor. For example get id:
it.getLong(it.getColumnIndex("_id"))
}