Как передать поисковый запрос в источник данных или обновить единый пользовательский интерфейс 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", но я не могу ничего гуглить.. Еще одна вещь: я только что понял, что если я хочу изменить элемент (удалить или обновить), я не могу сделать это с вышеупомянутой структурой, которая у меня есть: мне нужно реализовать удалить элемент по клику или обновить элемент

0 ответов

Другие вопросы по тегам