lateinit属性onItemClickCallback尚未初始化

时间:2019-10-19 13:15:17

标签: android kotlin callback kotlin-lateinit

我是android和kotlin的新手。我正在使用接口为我的cardViewAdapter设置onclick侦听器,以便可以从我的活动中覆盖其回调。但是在模拟器上运行它并单击每个itemView时,出现错误“ lateinit属性onItemClick尚未初始化”。

在我的代码上,我尝试在一个函数中对其进行初始化。在此之前,我尝试了另一个答案,所以https://stackoverflow.com/a/46076355/7587265 但onclick无效

这是我的MainActivity.kt

int subset(int input[], int n, int output[][20]) {
if (n==0)
{
    output[0][0]=0;
    return 1;
}


int count=subset(input+1,n-1,output);
int i,j;
for(i=0;i<count;i++){
    output[count+i][0]=output[i][0]+1;
    output[count+i][1]=input[0];
}

for(i=0;i<count;i++){
    for(j=1;j<output[count+i][0];j++){
output[count+i][j+1]=output[i][j];
        }
}
return 2*count;

这是我的CardViewMainAdapter.kt

rvMotor.layoutManager = GridLayoutManager(this, 2)
val recycleViewAdapter = CardViewMainAdapter(listMotor)
recycleViewAdapter.setOnItemClickCallback(object : CardViewMainAdapter.OnItemClickCallback{
    override fun onItemClicked(data: Motor) {
        val intent = Intent(this@MainActivity, DetailActivity::class.java)
        intent.putExtra(DetailActivity.EXTRA_ID, data.id)
        startActivity(intent)
    }
})

rvMotor.adapter = recycleViewAdapter

3 个答案:

答案 0 :(得分:0)

根据文档::在未初始化Lateinit属性之前访问它会引发一个特殊异常,该异常可以清楚地标识正在访问的属性以及尚未初始化的事实。

要检查lateinit var是否已经初始化, 在对该属性的引用上使用 .isInitialized

我不为什么会在这里引起问题。我认为您的代码很好,但是我可以为您解决问题。

根据您的情况,您可以通过两种方式解决问题。

1。 只需在点击侦听器中添加一个if条件即可检查它是否被利用。

 holder.itemView.setOnClickListener{

        //Check whether it is Initialized or not
        if(::onItemClickCallback.isInitialized){
            onItemClickCallback.onItemClicked(listMotors[holder.adapterPosition])
        }
    }

OR

2。。删除Lateint并将其设置为可为空。

    //Make it as nullable
    private  var onItemClickCallback : OnItemClickCallback? = null

    holder.itemView.setOnClickListener {

        holder.itemView.setOnClickListener {
            // add ? for handling nullable 
            onItemClickCallback?.onItemClicked(listMotors[holder.adapterPosition])
        }

    }

答案 1 :(得分:0)

我最终在适配器参数而不是从函数中初始化onItemClickCallback。我以为我已经尝试过这种方法,但是由于未知的原因,它以前没有用。感谢您的所有回复。 这是我的活动

val recycleViewAdapter = CardViewMainAdapter(listMotor, object : CardViewMainAdapter.OnItemClickCallback{
            override fun onItemClicked(data: Motor) {
                val intent = Intent(this@MainActivity, DetailActivity::class.java)
                intent.putExtra(DetailActivity.EXTRA_ID, data.id)
                startActivity(intent)
            }
        })

rvMotor.adapter = recycleViewAdapter

这是我的适配器

class CardViewMainAdapter(private val listMotors: ArrayList<Motor>, private val onItemClickCallback: OnItemClickCallback) :
    RecyclerView.Adapter<CardViewMainAdapter.CardViewMainViewHolder>() {

答案 2 :(得分:-1)

根据official doc,在使用lateinit属性之前,可以安全地检查是否使用isInitialized对其进行了初始化,如下所示:

::onItemClickCallback.isInitialized

lateinit属性在DI(依赖注入)和UnitTest期间很方便。否则,在通常情况下,它类似于应在构造函数中初始化的Non Null类型属性