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