在Kotlin中初始化变量时遇到一些问题

时间:2019-11-13 10:34:59

标签: android kotlin

val owner:ViewHolder // <-保持器未初始化,并且此行中没有错误发生?

package adapter

import android.content.Context
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import bean.Planet
import com.example.list_view.R

class PlanetAdapter(private val context: Context, private val planetList: MutableList<Planet>) : BaseAdapter(){
    override fun getItem(position: Int): Any =planetList[position]
    override fun getItemId(position: Int): Long =position.toLong()
    override fun getCount(): Int =planetList.size
    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        var view=convertView
        val holder:ViewHolder  //<-the holder is not initialized and there is no error happen in this line ?
        if(convertView==null){
            view=LayoutInflater.from(context).inflate(R.layout.item_list_layout,parent,false)
            holder=ViewHolder()
            holder.ll_item=view.findViewById<LinearLayout>(R.id.ll_item)
            holder.iv_icon=view.findViewById<ImageView>(R.id.iv_icon)
            holder.tv_name=view.findViewById<TextView>(R.id.tv_name)
            holder.tv_desc=view.findViewById(R.id.tv_desc) as TextView
            view.tag=holder
        }else{
            holder= view!!.tag as ViewHolder
        }
        val planet=planetList[position]
        holder.ll_item.setBackgroundColor(Color.WHITE)
        holder.iv_icon.setImageResource(planet.image)
        holder.tv_name.text=planet.name
        holder.tv_desc.text=planet.desc
        return view!!

    }
    inner class ViewHolder{
        lateinit var ll_item:LinearLayout
        lateinit var iv_icon:ImageView
        lateinit var tv_name:TextView
        lateinit var tv_desc:TextView
    }
}

为什么我在kotlin中的类中声明了必须初始化的值或变量,而不必在类的成员函数中进行初始化?

2 个答案:

答案 0 :(得分:0)

首先应在Kotlin中初始化变量,如果它可以存储null,则对此有一个可选类型,或者您可以对某些对象(例如,views属性)使用惰性初始化。另外,您使用的是 val ,它是常量,以后不能为其分配值。因此请改用var。您可以像这样使用后期初始化

    lateinit var holder:RecyclerView.ViewHolder

答案 1 :(得分:0)

  

为什么我在kotlin的类中声明必须初始化的值或变量,而不必在类的成员函数中初始化?

在一个函数中,编译器可以保证在尝试使用局部变量之前是否对其进行了初始化。在您发布的代码中,有if-else个条件,可在两个分支中初始化您的holder

需要在实例init阶段初始化类级别的属性,以确保可以在使用它之前对其进行初始化。您可以使用lateinit关键字使其保持未初始化状态,并保证编译器将在首次使用前自行初始化它。