カーソルデータでリスト配列(スクロールするとリストに最初のアルファベットが表示される)を作成するにはどうすればよいですか?
Cursor
のすべての要素を調べて、それらを1つずつ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つの簡単な修正:上記の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の答えよりも優れているのは次のとおりです。
_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
}
_
オブジェクトの配列リストが欲しかったので、これは私にとって本当にうまくいきました:
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
を作成し、コンストラクターがあることを確認してください。
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"))
}