38

ここで説明されているように、Android Paging Library を使用しています: https://developer.android.com/topic/libraries/architecture/paging.html

しかし、名前でユーザーを検索するための EditText もあります。

ページング ライブラリからの結果をフィルター処理して、一致するユーザーのみを表示するにはどうすればよいですか?

4

3 に答える 3

25

EpicPandaForce の回答と同様のアプローチを使用しました。機能している間は、この購読/購読解除は面倒に思えます。Room 以外の別の DB を使い始めたので、とにかく独自の DataSource.Factory を作成する必要がありました。どうやら、現在の DataSource を無効にすることが可能であり、DataSource.Factory は新しい DataSource を作成します。そこで、検索パラメーターを使用します。

私のDataSource.Factory:

class SweetSearchDataSourceFactory(private val box: Box<SweetDb>) :
DataSource.Factory<Int, SweetUi>() {

var query = ""

override fun create(): DataSource<Int, SweetUi> {
    val lazyList = box.query().contains(SweetDb_.name, query).build().findLazyCached()
    return SweetSearchDataSource(lazyList).map { SweetUi(it) }
}

fun search(text: String) {
    query = text
}
}

ここでは ObjectBox を使用していますが、作成時に部屋の DAO クエリを返すことができます (既に DataSourceFactory であるため、独自の作成を呼び出します)。

私はそれをテストしませんでしたが、これはうまくいくかもしれません:

class SweetSearchDataSourceFactory(private val dao: SweetsDao) :
DataSource.Factory<Int, SweetUi>() {

var query = ""

override fun create(): DataSource<Int, SweetUi> {
    return dao.searchSweets(query).map { SweetUi(it) }.create()
}

fun search(text: String) {
    query = text
}
}

もちろん、すでに dao からのクエリで Factory を渡すこともできます。

ビューモデル:

class SweetsSearchListViewModel
@Inject constructor(
private val dataSourceFactory: SweetSearchDataSourceFactory
) : BaseViewModel() {

companion object {
    private const val INITIAL_LOAD_KEY = 0
    private const val PAGE_SIZE = 10
    private const val PREFETCH_DISTANCE = 20
}

lateinit var sweets: LiveData<PagedList<SweetUi>>

init {
    val config = PagedList.Config.Builder()
        .setPageSize(PAGE_SIZE)
        .setPrefetchDistance(PREFETCH_DISTANCE)
        .setEnablePlaceholders(true)
        .build()

    sweets = LivePagedListBuilder(dataSourceFactory, config).build()
}

fun searchSweets(text: String) {
    dataSourceFactory.search(text)
    sweets.value?.dataSource?.invalidate()
}
}

ただし、検索クエリは受信されます。ViewModel で searchSweets を呼び出すだけです。Factory に検索クエリを設定し、DataSource を無効にします。次に、ファクトリで create が呼び出され、DataSource の新しいインスタンスが新しいクエリで作成され、内部の既存の LiveData に渡されます。

于 2018-06-20T16:07:59.840 に答える