我已成功從 Reddit API 中提取 JSON,但無法將其放入我的 RecyclerView。我設定了一個 Log 來檢查我的 JSON 是空還是 null,并且 Log 成功列印了所需的輸出,這意味著我的 JSON 不為空并且包含必要的資料。
這是我的HomeFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Log.d(javaClass.simpleName, "onViewCreated")
val rv = binding.recyclerView
val adapter = PostRowAdapter(viewModel)
rv.adapter = adapter
rv.layoutManager = LinearLayoutManager(binding.root.context)
viewModel.netFetchData()
viewModel.observeData().observe(viewLifecycleOwner) {
Log.d("asd","show me the author from json first index : " it.get(0).author)
adapter.submitList(it)
adapter.notifyDataSetChanged()
}
//adapter.notifyDataSetChanged()
}
這是我的MainViewModel.kt
fun netFetchData() = viewModelScope.launch(
context = viewModelScope.coroutineContext
Dispatchers.IO) {
data.postValue(repository.getPosts(subreddit.value.toString()))
}
fun observeData(): LiveData<List<RedditPost>> {
return data
}
這是我的PostRowAdapter.kt
class PostRowAdapter(private val viewModel: MainViewModel)
: ListAdapter<RedditPost, PostRowAdapter.VH>(RedditDiff()) {
private var awwRow = listOf<RedditPost>()
class RedditDiff : DiffUtil.ItemCallback<RedditPost>() {
override fun areItemsTheSame(oldItem: RedditPost, newItem: RedditPost): Boolean {
return oldItem.key == newItem.key
}
override fun areContentsTheSame(oldItem: RedditPost, newItem: RedditPost): Boolean {
return RedditPost.spannableStringsEqual(oldItem.title, newItem.title) &&
RedditPost.spannableStringsEqual(oldItem.selfText, newItem.selfText) &&
RedditPost.spannableStringsEqual(oldItem.publicDescription, newItem.publicDescription) &&
RedditPost.spannableStringsEqual(oldItem.displayName, newItem.displayName)
}
}
inner class VH(val binding: RowPostBinding)
: RecyclerView.ViewHolder(binding.root)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {
val binding = RowPostBinding.inflate(LayoutInflater.from(parent.context),
parent, false)
return VH(binding)
}
override fun onBindViewHolder(holder: VH, position: Int) {
val binding = holder.binding
awwRow[position].let{
binding.title.text = it.title
Glide.glideFetch(it.imageURL,it.thumbnailURL,binding.image)
binding.selfText.text = it.selfText
binding.score.text = it.score.toString()
binding.comments.text = it.commentCount.toString()
}
}
override fun getItemCount() = awwRow.size
}
我認為我的代碼是正確的,但是當我運行應用程式時,RecyclerView 仍然是空白的。我哪里錯了?
uj5u.com熱心網友回復:
您PostRowAdapter正在填充awwRow串列,該串列在開始時為空且從未更新,因此RecyclerView它將始終包含 0 個元素
如果你使用ListAdapterandsubmitList(...)方法,那么你不應該覆寫getItemCount并且你不應該有自己的資料串列,所以洗掉這些行
private var awwRow = listOf<RedditPost>() // on top
override fun getItemCount() = awwRow.size // on bottom
如果您想使用方法訪問整個串列集,submitList()則可以在配接器內部呼叫getCurrentList()。如果您需要特定位置的特定專案(例如 in onBindViewHolder),請使用getItem(position). 所以而不是
awwRow[position].let{
你應該有
getItem(position).let{
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516809.html
標籤:安卓科特林android-recyclerview安卓阵列适配器安卓视图模型
上一篇:三角形Kotlin的斜邊
下一篇:呼叫kotlin的方法
