kotlin - 使用 Retrofit2 在 Recyclerview 中未设置 Gson 转换的数据
问题描述
未使用 Retrofit2 和 rxjava2 在 Recyclerview 中设置 Gson Convertable 数据,然后给出错误:
“kotlin.UninitializedPropertyAccessException:lateinit 属性compositeDisposable 尚未初始化”
MainActivity.kt
internal lateinit var api : APIInterface
lateinit var compositeDisposable: CompositeDisposable
internal lateinit var companyDialog : Dialog
internal lateinit var companyAdapter: CompanyAdapter
internal lateinit var data : List<Company>
fun showCompanyPopupView(){
companyDialog.setContentView(R.layout.compny_popup_screen)
val rvCompany : RecyclerView = companyDialog.findViewById(R.id.rvCompany)
rvCompany.setHasFixedSize(true)
rvCompany.layoutManager = LinearLayoutManager(this)
fetchData()
companyDialog.window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
companyDialog.show()
}
private fun fetchData(){
val retrofit = APIClient.apIClient
if (retrofit != null) {
api = retrofit.create(APIInterface::class.java)
}
compositeDisposable.add(api.getCompanyData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({ companyList-> displayData(data)
},{
Toast.makeText(applicationContext, it.message, Toast.LENGTH_SHORT).show()
})
)
}
private fun displayData(companyList: List<Company>) {
val adapter = CompanyAdapter(this,companyList)
rvCompany.adapter = adapter
}
公司适配器.kt
class CompanyAdapter(internal var context: Context, internal var companyList: List) :RecyclerView.Adapter(){ override fun onCreateViewHolder(p0: ViewGroup, p1: Int): CompanyViewHolder { TODO("not implemented") //改变正文创建的函数使用 File | 设置 | 文件模板。
val itemView = LayoutInflater.from(p0.context).inflate(R.layout.list_view_item,p0,false)
return CompanyViewHolder(itemView)
}
override fun getItemCount(): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
return companyList?.size!!
}
override fun onBindViewHolder(p0: CompanyViewHolder, p1: Int) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
// p0.rbButton.text = this!!.companyList?.get(p1)?.Cmp_Name
p0.bindModel(companyList[p1])
}
inner class CompanyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
val radioButton : RadioButton = itemView.findViewById(R.id.rbCompanyName)
fun bindModel(company: Company){
radioButton.text = company.Cmp_Name
}
}
}
解决方案
The error is very well described, you're using your variable compositeDisposable before initializing it.
Just initialize your variable this way before you call it:
internal lateinit var api : APIInterface
var compositeDisposable = CompositeDisposable()
internal lateinit var companyDialog : Dialog
internal lateinit var companyAdapter: CompanyAdapter
internal lateinit var data : List<Company>
fun showCompanyPopupView(){
companyDialog.setContentView(R.layout.compny_popup_screen)
val rvCompany : RecyclerView = companyDialog.findViewById(R.id.rvCompany)
rvCompany.setHasFixedSize(true)
rvCompany.layoutManager = LinearLayoutManager(this)
fetchData()
companyDialog.window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
companyDialog.show()
}
private fun fetchData(){
val retrofit = APIClient.apIClient
if (retrofit != null) {
api = retrofit.create(APIInterface::class.java)
}
compositeDisposable.add(api.getCompanyData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({ companyList-> displayData(data)
},{
Toast.makeText(applicationContext, it.message,
Toast.LENGTH_SHORT).show()
})
)
}
推荐阅读
- c - 解析 C 声明
- android - 在RxAndroid(Observable)中将订阅添加到disposable后,控制流结束而不调用subscribe..!
- angular - Datepicker Angular Material 过滤器验证
- java - 如何使用 Hibernate 的 CriteriaBuilder 构建 select count(*) 和 group by SQL 查询?
- javascript - 是否有在保留对象的同时解构对象属性的快捷方式?
- apache-nifi - Apache NiFi评估jsonpath处理器:连接2个属性的JSONPath表达式
- android - 修复了可见的标签/点 TabLayout android
- java - 从笛卡尔积中获取不同记录的算法
- flutter - Stepper 中的图标太大
- java - Trying to getAudioInputStream to URL (java.net.MalformedURLException) java