如何在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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

The Google Mobile Ads SDK was initialized without AppMeasurement(Google 移动广告 SDK 在没有 AppMeasurement 的情况下进行了初始化)
No JNI_OnLoad found in ... skipping init(在 ... 中未找到 JNI_OnLoad 正在跳过初始化)
No JNI_OnLoad found skipping init gt; Application shutdown(没有找到跳过初始化的 JNI_OnLoad 应用程序关闭)
Fatal error: use of unimplemented initializer #39;init(coder:)#39; for class(致命错误:对类使用未实现的初始化程序“init(coder:))
Error in Swift class: Property not initialized at super.init call(Swift 类中的错误:在 super.init 调用时未初始化属性)
Conditional Binding: if let error – Initializer for conditional binding must have Optional type(条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型)