I am pulling data from api in my application. I keep the data I have in MutableLiveData. There is no problem so far. However, when I filter and pull other data, it lists the new data under the old data. My goal is to delete the old data and show only the new data.
ViewModel
val breakingNews: MutableLiveData<Resource<NewsResponse>> = MutableLiveData()
var breakingNewsPage = 1
var breakingNewsResponse: NewsResponse? = null
fun getCategoryNews(countryCode: String,category:String) = viewModelScope.launch {
Is it possible to do a check here?
breakingNews.postValue(Resource.Loading())
val response = newsRepository.getBreakingNews(countryCode,category,1)
breakingNews.postValue(handleBreakingNewsResponse(response))
}
private fun handleBreakingNewsResponse(response: Response<NewsResponse>): Resource<NewsResponse> {
if (response.isSuccessful) {
response.body()?.let { resultResponse ->
breakingNewsPage++
if (breakingNewsResponse == null) {
breakingNewsResponse = resultResponse
} else {
val oldArticles = breakingNewsResponse?.articles
val newArticles = resultResponse.articles
oldArticles?.addAll(newArticles)
}
return Resource.Success(breakingNewsResponse ?: resultResponse)
}
}
return Resource.Error(response.message())
}
Fragment(Observe)
viewModel.breakingNews.observe(viewLifecycleOwner, Observer { response ->
when (response) {
is Resource.Success -> {
hideProgressBar()
response.data?.let { newsResponse ->
newsAdapter.differ.submitList(newsResponse.articles.toList())
val totalPages =
newsResponse.totalResults / QUERY_PAGE_SIZE + 2 //Sayfada boşluk oluşuyor
isLastPage = viewModel.breakingNewsPage == totalPages
if (isLastPage) {
rvBreakingNews.setPadding(0, 0, 0, 0)
}
}
}
Adapter.kt
class NewsAdapter() : RecyclerView.Adapter<NewsAdapter.ArticleViewHolder>() {
var formatPattern = "yyyy-MM-dd'T'HH:mm:ss"
inner class ArticleViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
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)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ArticleViewHolder {
return ArticleViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_article_preview,
parent,
false
)
)
}
override fun getItemCount(): Int {
return differ.currentList.size
}
private var onItemClickListener: ((Article) -> Unit)? = null
override fun onBindViewHolder(holder: ArticleViewHolder, position: Int) {
val article = differ.currentList[position]
holder.itemView.apply {
Glide.with(this).load(article.urlToImage).into(ivArticleImage)
tvSource.text = article.source?.name
tvTitle.text = article.title
tvDescription.text = article.description
var formattedTime=setTime(differ.currentList.get(position).publishedAt)
tvPublishedAt.text = formattedTime
setOnClickListener {
onItemClickListener?.let { it(article) }
}
}
}