簡體   English   中英

Retrofit 響應保留舊數據並將新數據添加到 editText 搜索

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM