我正在做一个学校项目。
我有一个与Doses一起使用的列表,所以我需要一一读取设置文本时的数据。
现在我得到:
kotlin.UninitializedPropertyAccessException:lateinit属性医学尚未初始化。
因此,我需要等到第一个项目被提取并设置好之后才能继续下一个项目。
你能帮助我吗?
class ClientDoseListAdapter(private val doses: List<Dose>) : RecyclerView.Adapter<ClientDoseListAdapter.ViewHolder>() {
private lateinit var medicine : Medicine
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.client_dose_listitem, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = doses[position]
runBlocking {
displayMedicine(item.medicine)
}
holder.med_name.text = medicine.name
holder.dose_amount.text = item.amount.toString()
}
private suspend fun displayMedicine(id: Int) {
fetchMedicine(id)
}
override fun getItemCount(): Int = doses.size
inner class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView),
LayoutContainer
private fun fetchMedicine(id: Int) {
service.getMedicine(id, "Bearer ${ClienOverzichtFragment.auth}")
.enqueue(object : Callback<List<Medicine>> {
override fun onResponse(call: Call<List<Medicine>>, response: Response<List<Medicine>>) {
if (response.code() == 200) {
val temp = response.body()!!
medicine = temp[0]
Log.v("SHIT", medicine.name)
} else {
Log.v("SHIT", response.code().toString())
//TODO
}
}
override fun onFailure(call: Call<List<Medicine>>, t: Throwable) {
Log.v("SHIT", "FAILED : "+t.message)
}
})
}
}
最佳答案
将您的服务调用移出Recycler(最好移入ViewModel,但可以从Activity或使用任何其他模式进行调用-最主要的是,不应该属于Recycler)并将接收到的数据传递到Recycler中。
您的ClientDoseListAdapter接受药物:
class ClientDoseListAdapter(private val doses: List<Dose>, private val medicine: Medicine)
在您的活动中,启动并呼叫药物并观察它-当数据到达时,将其传递给适配器。假设您使用视图模型,那么Activity中的代码将如下所示:
viewModel.getMedicine().observe(
this,
Observer<Medicine> { medicine ->
//assuming doses come from somewhere else
adapter = ClientDoseListAdapter(doses, medicine, this)
clientDoseRecyclerView.adapter = adapter
}
)