【问题标题】:Android Kotlin RecyclerView Adapter onCreateViewHolder no calledAndroid Kotlin RecyclerView 适配器 onCreateViewHolder 未调用
【发布时间】:2020-07-05 12:01:57
【问题描述】:

这是我创建的适配器。

        groupsAdapter = GroupsAdapter(groupsVM)
        groupsRecyclerView.apply {
            // use this setting to improve performance if you know that changes
            // in content do not change the layout size of the RecyclerView
            setHasFixedSize(false)
            // specify an viewAdapter
            adapter = groupsAdapter
            // use a linear layout manager
            layoutManager = LinearLayoutManager(context)
        }

然后我设置了viewmodel的监听器

       groupsVM.groupNames.observe(viewLifecycleOwner , Observer {
            groupsAdapter.setData(it)
        })

以上代码在视图中。

那么,这就是我的适配器类

class GroupsAdapter()
    : RecyclerView.Adapter<GroupsAdapter.MyViewHolder>(){

    private var dataList = emptyList<Pair<String, String>>()

    fun setData(groupNameList: List<Pair<String, String>>){
        dataList = groupNameList
        notifyDataSetChanged()
    }

    class MyViewHolder(private val view: View) :
        RecyclerView.ViewHolder(view){

        val groupView = itemView.findViewById<TextView>(R.id.group_view) as View
        val groupNameTextView = itemView.findViewById<TextView>(R.id.group_name) as TextView
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):
            MyViewHolder {
        // create a new view
        val view = LayoutInflater.from(parent.context).
            inflate(R.layout.group, parent, false) as View
        return MyViewHolder(view)
    }

    override fun getItemCount(): Int {
        return dataList.size
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val group = dataList[position]
        if (group != null) {
            holder.groupNameTextView.text = group.second
        }
    }

}

当调用 getItemCount 并返回一个正值时,我也希望 onCreateViewHolder 也被调用。 但永远不会调用 onCreateViewHolder。 你能帮助我吗? 非常感谢!

【问题讨论】:

  • 您启用了setHasFixedSize(true)。您是否检查了对 getItemCount() 的第一次调用没有返回 0?
  • 是的,第一次返回0。我将 fixedSize 设置为 false,但仍然没有任何反应...
  • 您应该避免在适配器构造函数中传递 ViewModel,而是设置默认数据或将空列表作为初始数据传递给适配器构造函数。
  • 我已经更改了代码,但仍然没有

标签: android kotlin android-recyclerview adapter


【解决方案1】:

更新:

将此功能添加到您的适配器:

var dataList = emptyList<String>()

fun setData(groupNameList:List<String>){
    dataList = groupNameList
    notifyDataSetChanged()
}

并在观察者收到数据时设置数据:

 groupsVM.groupNames.observe(viewLifecycleOwner , Observer {
        groupsAdapter.setData(it)
    })

【讨论】:

  • 它永远不会被调用。与 onBindViewHolder 相同。
  • 您的getItemCount 每次返回什么?它的大小列表是和你想要的一样还是为零?
  • 这是我想要的尺寸
  • 你在哪里设置数据到你的适配器?
  • onBindViewHolder 函数
【解决方案2】:

我刚刚使用了您的代码,它运行良好,并且调用了 onCreateViewHolder()。
问题当然不在于这段代码,它一定是在你的布局中的其他地方

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多