我是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
答案 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类型属性