Как передать поисковый запрос в источник данных или обновить единый пользовательский интерфейс itemon?
Я использую библиотеку подкачки:
Класс CommunityViewModel: BaseMvvmViewModel() {
fun init(@PageType pageType: Int) { factory = CommunityDatasourceFactory(pageType) networkstate = Transformations.switchMap( factory!!.liveData) { it.networkState } initialLoading = Transformations.switchMap( factory!!.liveData) { it.initialLoading } flowable = RxPagedListBuilder(factory!!, config ).buildFlowable(BackpressureStrategy.BUFFER) } fun setQuery(query: String?){ factory?.let { val dataSource = it.liveData.value as NetworkStateItemKeyedDataSource dataSource.apply { it.liveData.value?.invalidate() }.also { (it as CommunityDataSource).setSearchTerm(query) } } } override fun refresh() { factory?.let { it.liveData.value?.invalidate() } } }
Класс CommunityDatasourceFactory( @PageType val pageType: Int):DataSource.Factory() {
val liveData: MutableLiveData<NetworkStateItemKeyedDatasource<String, CommunityProfileDTO>> = MutableLiveData() override fun create(): DataSource<String, CommunityProfileDTO> { val dataSource = when(pageType) { PageType.FOLLOWERS -> FollowersDataSource() PageType.FOLLOWINGS -> FollowingsDataSource() PageType.ALL -> AllDataSource() else -> { null} } liveData.postValue(dataSource as NetworkStateItemKeyedDataSource<String, CommunityProfileDTO>?) return dataSource!! } }
Класс FollowersDataSource(): NetworkStateItemKeyedDataSource
var term: String? = null private var changedRequestDisposable = false private var pendinglistInitialSize = 0 private var pendinglistActualSize = 0 private var requestId = "" init { this.TAG = FollowersDataSource::class.java.canonicalName } override fun loadInitial(params: ItemKeyedDataSource.LoadInitialParams<String> , callback: ItemKeyedDataSource.LoadInitialCallback<CommunityProfileDTO>) { initialLoading.postValue(NetworkState.LOADING) compositeDisposable.add( Api.communityManager().getPendingAndFollowers("" , params.requestedLoadSize , term?:"" , "Name" , true) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ if (it.isSuccessful) { it.body()?.data?.let { it1 -> callback.onResult(it1) initialLoading.postValue(NetworkState.onSuccess(it1.size)) } } else { initialLoading.postValue(NetworkState.error(Throwable(it.message()))) } }, { initialLoading.postValue(NetworkState.error(it)) })) } override fun loadAfter(params: ItemKeyedDataSource.LoadParams<String>,callback: ItemKeyedDataSource.LoadCallback<CommunityProfileDTO>) { networkState.postValue(NetworkState.LOADING) compositeDisposable.add( Api.communityManager().getPendingAndFollowers(params.key , params.requestedLoadSize , term?:"" , "Name" , true) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ it.body()?.data?.let { it1 -> callback.onResult(it1) } networkState.postValue(NetworkState.SUCCESS) },{ networkState.postValue(NetworkState.error(it)) })) } override fun loadBefore(params:ItemKeyedDataSource.LoadParams<String>, callback:ItemKeyedDataSource.LoadCallback<CommunityProfileDTO>) { } override fun invalidate() { super.invalidate() initialLoading.postValue(NetworkState.LOADING) networkState.postValue(NetworkState.LOADING) } override fun setSearchTerm(searchTerm: String?) { invalidate() term = searchTerm } override fun getKey(item: CommunityProfileDTO): String { return item.id } }
я пытался передать "searchTerm" в Detasource и сделать недействительным, но этот метод создает новый экземпляр. Я не могу понять, как реализовать поиск пользователя. Я думаю, мне следует создать экземпляр источника данных с параметром "searchTerm", но я не могу ничего гуглить.. Еще одна вещь: я только что понял, что если я хочу изменить элемент (удалить или обновить), я не могу сделать это с вышеупомянутой структурой, которая у меня есть: мне нужно реализовать удалить элемент по клику или обновить элемент