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中的类中声明了必须初始化的值或变量,而不必在类的成员函数中进行初始化?
答案 0 :(得分:0)
首先应在Kotlin中初始化变量,如果它可以存储null,则对此有一个可选类型,或者您可以对某些对象(例如,views属性)使用惰性初始化。另外,您使用的是 val ,它是常量,以后不能为其分配值。因此请改用var。您可以像这样使用后期初始化
lateinit var holder:RecyclerView.ViewHolder
答案 1 :(得分:0)
为什么我在kotlin的类中声明必须初始化的值或变量,而不必在类的成员函数中初始化?
在一个函数中,编译器可以保证在尝试使用局部变量之前是否对其进行了初始化。在您发布的代码中,有if
-else
个条件,可在两个分支中初始化您的holder
。
需要在实例init阶段初始化类级别的属性,以确保可以在使用它之前对其进行初始化。您可以使用lateinit
关键字使其保持未初始化状态,并保证编译器将在首次使用前自行初始化它。