새 지원 라이브러리를 사용하고 있습니다 ListAdapter
. 다음은 어댑터의 코드입니다.
class ArtistsAdapter : ListAdapter<Artist, ArtistsAdapter.ViewHolder>(ArtistsDiff()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(parent.inflate(R.layout.item_artist))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(getItem(position))
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind(artist: Artist) {
itemView.artistDetails.text = artist.artistAlbums
.plus(" Albums")
.plus(" \u2022 ")
.plus(artist.artistTracks)
.plus(" Tracks")
itemView.artistName.text = artist.artistCover
itemView.artistCoverImage.loadURL(artist.artistCover)
}
}
}
어댑터를 업데이트하고 있습니다.
musicViewModel.getAllArtists().observe(this, Observer {
it?.let {
artistAdapter.submitList(it)
}
})
내 diff 클래스
class ArtistsDiff : DiffUtil.ItemCallback<Artist>() {
override fun areItemsTheSame(oldItem: Artist?, newItem: Artist?): Boolean {
return oldItem?.artistId == newItem?.artistId
}
override fun areContentsTheSame(oldItem: Artist?, newItem: Artist?): Boolean {
return oldItem == newItem
}
}
어댑터가 모든 항목을 처음 렌더링 할 때 submitList가 호출 될 때 발생하는 일이 발생하지만, submitList가 업데이트 된 객체 속성으로 다시 호출 될 때 변경된 뷰를 다시 렌더링하지 않습니다.
목록을 스크롤하면 뷰가 다시 렌더링됩니다. bindView()
또한 adapter.notifyDatasSetChanged()
제출 목록 후 호출 하면 업데이트 된 값으로 뷰가 렌더링되지만 notifyDataSetChanged()
목록 어댑터에 diff 유틸리티가 내장되어 있으므로 호출하고 싶지 않습니다 .
누구든지 여기서 나를 도울 수 있습니까?
ArtistsDiff
는Artist
자체 구현과 관련이있을 수 있습니다 .