如何在Kotlin中初始化适用于Android的RecclerView适配器中的viewHolder

How to initialize viewHolder in RecyclerView adapter for Android in Kotlin(如何在Kotlin中初始化适用于Android的RecclerView适配器中的viewHolder)

本文介绍了如何在Kotlin中初始化适用于Android的RecclerView适配器中的viewHolder的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我应该如何初始化viewHolder?我有这个错误: 我想要做的是在RececumerView中获得选定的项目,但不使用onClick方法。当我收到这个选定的项目时,我需要显示Toast消息。项目是数据类。

进程:com.pors.coopreaderlast,id:7862 Kotlin.UnInitializedPropertyAccessException:lateinit属性viewHolder尚未初始化 在com.pors.coopreaderlast.features.polozka.PolozkaAdapter.getViewHolder(PolozkaAdapter.kt:18) 在com.pors.coopreaderlast.features.polozka.PolozkaAdapter.getCurrentItem(PolozkaAdapter.kt:46) 在com.pors.coopreaderlast.features.polozka.PolozkaActivity.onStart(PolozkaActivity.kt:213)

这是在Adapter中设置了viewHolder的行: Lateinit var viewHolder:PolozkaViewHolder

这是适配器

class PolozkaAdapter(val chosen_item: Int, private val listener: OnItemClickListener): ListAdapter<Polozka, PolozkaAdapter.PolozkaViewHolder>(DiffCallback()){
    var selectedItemPosition: Int = chosen_item
    lateinit var viewHolder: PolozkaViewHolder

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PolozkaViewHolder {
        val binding = PolozkyItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        viewHolder = PolozkaViewHolder(binding)
        return viewHolder
    }
    override fun onBindViewHolder(holder: PolozkaViewHolder, position: Int) {
        val currentItem = getItem(position)
        holder.bind(currentItem)
        if (selectedItemPosition == position){
            holder.itemView.setBackgroundColor(Color.parseColor("#DA745A"))
        } else{
            holder.itemView.setBackgroundColor(Color.TRANSPARENT)
        }
    }
    fun getCurrentItem(): Polozka = super.getItem(viewHolder.bindingAdapterPosition)    

    inner class PolozkaViewHolder(private val binding: PolozkyItemBinding): RecyclerView.ViewHolder(binding.root){
        init {
            binding.root.setOnClickListener{
                val position = bindingAdapterPosition
                if (position != RecyclerView.NO_POSITION){
                    val item = getItem(position)
                    if (item != null){
                        listener.onItemClick(item, position)                        
                    }
                }
                notifyItemChanged(selectedItemPosition)                
                selectedItemPosition = bindingAdapterPosition
                notifyItemChanged(selectedItemPosition)
            }            
        }

        fun bind(polozkaPolozka: Polozka){
            binding.apply {
                tvKDE.text = polozkaPolozka.znacky
                tvREG.text = polozkaPolozka.reg
                tvVB.text = polozkaPolozka.veb.toString()  
            }
        }
        }
    }
    interface OnItemClickListener{
        fun onItemClick(polozkaDoklad: Polozka, position: Int)        
    }
    class DiffCallback: DiffUtil.ItemCallback<Polozka>(){
        override fun areItemsTheSame(oldItem: Polozka, newItem: Polozka) =
            oldItem.pvp06pk == newItem.pvp06pk
        override fun areContentsTheSame(oldItem: Polozka, newItem: Polozka) =
            oldItem == newItem
    }
}

这是onStart方法,但它也可以在onCreate方法中。

 override fun onStart() {
        super.onStart()
        
        val polozkaAdapter = PolozkaAdapter(idPositionItem, this)
        val selectedItem = polozkaAdapter.getCurrentItem()        
    }

推荐答案

onCreateViewHolder应始终返回ViewHolder的新实例,而不是单个实例。

这篇关于如何在Kotlin中初始化适用于Android的RecclerView适配器中的viewHolder的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:如何在Kotlin中初始化适用于Android的RecclerView适配器中的viewHolder

基础教程推荐