Android KOTLIN:基本异步/协同路由

Android KOTLIN:基本异步/协同路由,android,kotlin,Android,Kotlin,我正在做一个学校项目 我有一个剂量列表,所以我需要一个接一个地获取数据 现在我得到: kotlin.UninitializedPropertyAccessException:lateinit属性尚未初始化 因此,我需要等到第一个项目被提取并设置好后,才能继续下一个项目。 你能帮我吗 class ClientDoseListAdapter(private val doses: List<Dose>) : RecyclerView.Adapter<ClientDoseListAda

我正在做一个学校项目

我有一个剂量列表,所以我需要一个接一个地获取数据

现在我得到:

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)
                }
            })
    }

}
类clientdoselistatadapter(private-val:List):RecyclerView.Adapter(){
私人医疗:医学
override onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder{
val view=LayoutInflater.from(parent.context)
.充气(R.layout.client\u dose\u listitem,父项,false)
返回视图保持器(视图)
}
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
val项目=剂量[位置]
运行阻塞{
显示药物(项目.药物)
}
holder.med_name.text=medicine.name
holder.dose_amount.text=item.amount.toString()
}
私家医生(id:Int){
药物(id)
}
重写getItemCount():Int=doges.size
内部类ViewHolder(覆盖val containerView:View):RecyclerView.ViewHolder(containerView),
布局容器
私人药物(id:Int){
service.getMedicine(id,“Bearer${ClienOverzichtFragment.auth}”)
.enqueue(对象:回调{
覆盖fun onResponse(调用:调用,响应:响应){
if(response.code()==200){
val temp=响应。主体()!!
医学=温度[0]
Log.v(“屎”,医学名称)
}否则{
Log.v(“狗屎”,response.code().toString())
//待办事项
}
}
覆盖失效时的乐趣(调用:调用,t:可丢弃){
Log.v(“狗屎”,“失败:”+t.message)
}
})
}
}

将您的服务呼叫移出回收器(最好是进入ViewModel,但可以从活动或使用任何其他模式进行呼叫-最重要的是,不应该是回收器的一部分),并在收到数据时将其传递到回收器中

您的客户是否愿意接受药物:

class ClientDoseListAdapter(private val doses: List<Dose>, private val medicine: Medicine)
class ClientDoseListAdapter(私人val剂量:列表,私人val药物:药物)
在您的活动中,启动和呼叫药物并观察它-当数据到达时,将其传递给适配器。假设您使用视图模型,则活动中的代码将如下所示:

viewModel.getMedicine().observe(
                this,
                Observer<Medicine> { medicine ->
                    //assuming doses come from somewhere else
                    adapter = ClientDoseListAdapter(doses, medicine, this)
                    clientDoseRecyclerView.adapter = adapter

                }
        )
viewModel.getMedicine().观察(
这
观察员{医学->
//假设剂量来自其他地方
适配器=clientdoselistatadapter(剂量、药物、此)
clientDoseRecyclerView.adapter=适配器
}
)

将您的服务呼叫移出回收器(最好是进入ViewModel,但可以从活动或使用任何其他模式进行呼叫-最重要的是,不应该是回收器的一部分),并在收到数据时将其传递到回收器中

您的客户是否愿意接受药物:

class ClientDoseListAdapter(private val doses: List<Dose>, private val medicine: Medicine)
class ClientDoseListAdapter(私人val剂量:列表,私人val药物:药物)
在您的活动中,启动和呼叫药物并观察它-当数据到达时,将其传递给适配器。假设您使用视图模型,则活动中的代码将如下所示:

viewModel.getMedicine().observe(
                this,
                Observer<Medicine> { medicine ->
                    //assuming doses come from somewhere else
                    adapter = ClientDoseListAdapter(doses, medicine, this)
                    clientDoseRecyclerView.adapter = adapter

                }
        )
viewModel.getMedicine().观察(
这
观察员{医学->
//假设剂量来自其他地方
适配器=clientdoselistatadapter(剂量、药物、此)
clientDoseRecyclerView.adapter=适配器
}
)