【问题标题】:kotlin notifyDataSetChanged does not update the viewkotlin notifyDataSetChanged 不更新视图
【发布时间】:2021-01-03 09:03:55
【问题描述】:

几天前我开始使用 kotlin,但我遇到了 recyclerView 的问题。当我调用适配器的 notifyDataSetChanged 方法时,视图不会更新。 (我使用了调试器,并且我的变量“usersList”已更新,但视图未更新。这是我的适配器类:

private class RankingAdapter : RecyclerView.Adapter<RankingViewHolder>() {
        var usersList : MutableList<User?>? = mutableListOf()
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RankingViewHolder {
            val v = LayoutInflater.from(parent.context)
                    .inflate(R.layout.ranking_item_layout, parent,false) as LinearLayout
            return RankingViewHolder(v)
        }

        override fun getItemCount(): Int {
            return usersList?.size ?: 0
        }

        override fun onBindViewHolder(holder: RankingViewHolder, position: Int) {
            val user : User? = usersList?.get(position)
            holder.rank.text = (usersList?.indexOf(user)).toString()
            holder.name.text = user?.firstName
            holder.points.text = user?.score.toString()
        }

        fun setUsers(users : List<User?>) {
            usersList?.clear()
            usersList?.addAll(users)
            notifyDataSetChanged()
        }
    }

以及调用setUsers(users)的方法

private fun displayRanking(users : List<User>) {
        visibleLayout.visibility = View.VISIBLE
        errorImageView.visibility = View.GONE
        progressBar.visibility = View.GONE
        val logedInUser = SaveSharedPreference.getLogedInUser(context)
        userRank.text = (adapter.usersList?.indexOf(logedInUser)).toString()
        userName.text = logedInUser.firstName
        userPoints.text = logedInUser.score.toString()
        adapter.setUsers(users)
    }

【问题讨论】:

  • 你做了recyclerview.adapter = adapter
  • 是的:适配器 = RankingAdapter() 和 recyclerView.adapter = 适配器

标签: android kotlin android-recyclerview


【解决方案1】:

编辑 1:试试这个

fun setUsers(users : List<User?>) {
        usersList?.clear()
        usersList?.addAll(users)
}

你在哪里设置recyclerView Adapter:

recyclerView.layoutManager = LinearLayoutManger(this, LinearLayoutManager.Vertical, false)
recyclerView.setAdapter(adapter)

并且在你的 displayRanking 函数中:

private fun displayRanking(users : List<User>) {
    visibleLayout.visibility = View.VISIBLE
    errorImageView.visibility = View.GONE
    progressBar.visibility = View.GONE
    val logedInUser = SaveSharedPreference.getLogedInUser(context)
    userRank.text = (adapter.usersList?.indexOf(logedInUser)).toString()
    userName.text = logedInUser.firstName
    userPoints.text = logedInUser.score.toString()

    adapter.setUsers(users)
    adapter.notifyDataSetChanged()
}

在调用 adapter.setUsers(users) 后尝试在 displayRanking 函数 中调用 adapter.notifyDataSetChanged() 并删除 notifyDataSetChanged()适配器类。

【讨论】:

  • 问题依旧
  • @andrc 我编辑了我的答案,你可以试试这个吗?
  • @andrc 我只想告诉你,你应该把这个 recyclerView.layoutManager 移到你写 recyclerView.setAdapter(adapter) 的地方。然后您仍然可以在 displayRanking() 函数中使用 notifyDataSetChanged。这样,您的 recyclerView 将在其初始化时拥有 layoutManager,而不仅仅是在您第一次使用 displayRanking() 更改数据集时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多