[英]Retrofit responses keep the old data and add the new one to that for editText search
我正在使用 editText 搜索從 API 獲取數據。 起初搜索它按預期工作但在第二個等等,它不會顯示唯一的新響應,而是保留舊響應並在其末尾添加新響應。 它就像在緩存以前的一樣。 我該如何解決它以僅顯示最后的搜索詞結果?
分段:
var job: Job? = null
binding.etSearchNews.addTextChangedListener { editable ->
job?.cancel()
job = MainScope().launch {
delay(Constants.SEARCH_DELAY)
editable?.let {
if (editable.toString().isNotEmpty()) {
viewModel.searchNews(editable.toString())
}
}
}
}
viewModel.searchNews.observe(viewLifecycleOwner) {
when (it) {
is Resource.Success -> {
hideProgressBar()
it.data?.let { response ->
newsAdapter.differ.submitList(response.articles.toList())
}
}
is Resource.Error -> {}
is Resource.Loading -> {}
}
}
適配器:
private val differCallback = object: DiffUtil.ItemCallback<Article>() {
override fun areItemsTheSame(oldItem: Article, newItem: Article): Boolean {
return oldItem.url == newItem.url
}
override fun areContentsTheSame(oldItem: Article, newItem: Article): Boolean {
return oldItem == newItem
}
}
val differ = AsyncListDiffer(this, differCallback)
API:
@GET("v2/everything")
suspend fun searchNews(
@Query("q") query: String,
@Query("page") number: Int = 1,
@Query("pageSize") size: Int = Constants.PAGE_SIZE,
@Query("apiKey") key: String = Constants.API_KEY
): Response<NewsResponse>
我試圖添加但沒有運氣:
@Headers("Cache-Control: no-cache")
花了一天時間解決這個問題后,我終於找到了答案。 這是因為我之前沒有正確清除響應。 它需要在addTextChangedListener
中清理,這樣每次新的嘗試都會從新的響應開始。
同樣為了離開片段並返回它數據刷新和滾動 position 更改問題,我添加了hasFocus
來避免它:
所以,SearchFragment 看起來像這樣:
var job: Job? = null
binding.etSearchNews.addTextChangedListener { editable ->
job?.cancel()
job = MainScope().launch {
delay(Constants.SEARCH_DELAY)
editable?.let {
if (editable.toString().isNotEmpty()) {
if (binding.etSearchNews.hasFocus()) {
viewModel.searchNewsResponse = null
viewModel.searchNewsPage = 1
viewModel.searchNews(editable.toString())
}
} else {
newsAdapter.differ.submitList(listOf())
}
}
}
}
PS 我沒有在教程中看到該代碼,看了兩遍那部分。 我希望它對其他人有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.