ContentResolverでページングする

滅多なことでもない限りContentResolverを使った処理でページングする必要性なんてないでしょうが、滅多なことがあったので書きました。

fun get(page: Page): Pair<Items, Page> {
    val items = mutebleListOf()
    val hasNext: Boolean

    contentResolver.query(
        HogeHoge.CONTENT_URI.buildUpon()
            .appendQueryParameter("limit", "${PER_PAGE + 1}")
            .appendQueryParameter("offset", "${PER_PAGE * page.current}")
            .build(),
        null, null, null, null
    )?.use {
        while (it.moveToNext() && it.position < PER_PAGE) {
            items.add(/* 中身取り出す */)
        }
        hasNext = cursor.count > PER_PAGE
    } 
    return Items(items) to Page(page.current + 1, hasNext)
}

const val PER_PAGE = 50 // 一ページあたりの要素数
class Page(val current: Int = 0, val hasNext: Boolean = true)

雑に書くとこんな感じ。

limitとoffsetで普通にやってるだけです。
ちょっとテクってるポイントとしては、最初にページの要素数より一件多く取得しておいて次ページがあるかの判別に使ったりしてるところですが、まあそんなことをしなくても最後に一回空ページの読み込みが入るだけなのでそんなに必須ってわけでもないかあ。