如何在 Android 中使用光标数据创建列表数组
Posted
技术标签:
【中文标题】如何在 Android 中使用光标数据创建列表数组【英文标题】:How can I create a list Array with the cursor data in Android 【发布时间】:2010-11-24 03:37:18 【问题描述】:如何使用光标数据创建列表数组(滚动时列表显示第一个字母)?
【问题讨论】:
你想用光标的数据创建一个ArrayList
?
【参考方案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"))
【讨论】:
【参考方案2】:这个对我来说非常有效,因为我想要一个对象数组列表:
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
并确保它有一个构造函数。
【讨论】:
【参考方案3】:比@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
【讨论】:
唯一正确的遍历游标的方法。其他两个答案只是....错误:| 除了奇怪的场景外,通常可以将getColumnIndex外部化到循环之外【参考方案4】:一个快速修正:上面的 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();
【讨论】:
非常好的点imbrizi。这是循环游标元素的更好方法 如何添加两个或多个列值??【参考方案5】:遍历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
替换为您希望从光标中获取的值的列索引。)
【讨论】:
嗨,我想做的重要事情是在我的列表中显示“拳头字符”。从光标获取所有数据后,我不知道如何将其转换为 String[] 数组以获取“第一个字符”。它看起来像这样 char firstLetter = mString[firstVisibleItem].charAt(0); 朋友们:上面的 for 循环并不完全正确(条件和增量交换了)。使用for(mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext())
这种类型的循环读起来有点难看。 @PearsonArtPhoto 的解决方案更加优雅且易于阅读。
getWhateverTypeYouWant 是什么意思?这是真正的方法吗?以上是关于如何在 Android 中使用光标数据创建列表数组的主要内容,如果未能解决你的问题,请参考以下文章