首页 > 解决方案 > kotlin notifyDataSetChanged 不更新视图

问题描述

几天前我开始使用 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)
    }

标签: androidkotlinandroid-recyclerview

解决方案


编辑1:试试这个

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

在哪里设置 recyclerView 适配器:

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)并删除 Adapter 类中的 notifyDataSetChanged(),尝试在displayRanking 函数中调用 adapter.notifyDataSetChanged() 。


推荐阅读