我正在做一个学校项目。

我有一个与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

                }
        )

10-04 17:27