ここで説明されているように、Android Paging Library を使用しています: https://developer.android.com/topic/libraries/architecture/paging.html
しかし、名前でユーザーを検索するための EditText もあります。
ページング ライブラリからの結果をフィルター処理して、一致するユーザーのみを表示するにはどうすればよいですか?
ここで説明されているように、Android Paging Library を使用しています: https://developer.android.com/topic/libraries/architecture/paging.html
しかし、名前でユーザーを検索するための EditText もあります。
ページング ライブラリからの結果をフィルター処理して、一致するユーザーのみを表示するにはどうすればよいですか?
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 に渡されます。