[英]Android JSON to Kotlin Class with ViewHolder
I have a problem when using data class that generated by the JSONToKotlinClass extension from Android Studio.我在使用由 Android Studio 的JSONToKotlinClass扩展生成的数据 class 时遇到问题。
So i converted this JSON to data class in kotlin, The generated classes are UserDataClass
, UserDataClassItem
, Geo
, Company
and Address
.所以我将这个JSON 转换为 kotlin 中的数据 class,生成的类是
UserDataClass
, UserDataClassItem
, Geo
, Company
和Address
。
This is what UserDataClass
looks like:这是
UserDataClass
的样子:
package com.example.kotlinretrofitexample
class UserDataClass : ArrayList<UserDataClassItem>()
And this is what UserDataClassItem
looks like:这就是
UserDataClassItem
的样子:
package com.example.kotlinretrofitexample
import com.google.gson.annotations.SerializedName
data class UserDataClassItem(
@SerializedName("id")
var id: Int,
@SerializedName("name")
var name: String,
@SerializedName("username")
var username: String,
@SerializedName("email")
var email: String,
@SerializedName("address")
var address: Address,
@SerializedName("phone")
var phone: String,
@SerializedName("website")
var website: String,
@SerializedName("company")
var company: Company
)
So what i want to do is show these data with RecyclerView.所以我想做的是用 RecyclerView 显示这些数据。 Here's the Adapter i created:
这是我创建的适配器:
class UserAdapter(private val data: List<UserDataClass>?) : RecyclerView.Adapter<UserAdapter.MyHolder>(){
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.item_user, parent, false)
return MyHolder(v)
}
override fun getItemCount(): Int = data?.size ?: 0
override fun onBindViewHolder(holder: MyHolder, position: Int) {
holder.bind(data?.get(position))
}
class MyHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(get: UserDataClass?) {
itemView.nama.text = get?.name
itemView.email.text = get?.email
itemView.notelp.text = get?.phone
val address = "${get?.address?.street}, ${get?.address?.city}, ${get?.address?.suite}, ${get?.address?.zipcode}"
itemView.alamat.text = address
}
}
}
When Built, the error message returned:构建时,返回错误消息:
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
Unresolved reference: name
Unresolved reference: phone
Unresolved reference: address
Did i miss something??我错过了什么?? If there are things unclear, let me know!
如果有不清楚的地方,请告诉我!
Edit :编辑:
This is for the Address
class:这是
Address
class:
data class Address(
@SerializedName("street")
var street: String,
@SerializedName("suite")
var suite: String,
@SerializedName("city")
var city: String,
@SerializedName("zipcode")
var zipcode: String,
@SerializedName("geo")
var geo: Geo
)
This is for the Company Class
:这是针对
Company Class
的:
data class Company(
@SerializedName("name")
var name: String,
@SerializedName("catchPhrase")
var catchPhrase: String,
@SerializedName("bs")
var bs: String
)
And this is for the Geo
class:这是针对
Geo
class 的:
data class Geo(
@SerializedName("lat")
var lat: String,
@SerializedName("lng")
var lng: String
)
I believe you are getting UserDataClassItem
instead of UserDataClass
我相信你得到的是
UserDataClassItem
而不是UserDataClass
so pass the UserDataClassItem
to your adapter class in constructor.所以在构造函数中将
UserDataClassItem
传递给您的适配器 class 。
class UserAdapter(private val data: List< UserDataClassItem >?) : RecyclerView.Adapter<UserAdapter.MyHolder>(){
//change accordingly
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.