Class Kotlin泛型类
我是Kotlin的新手,正在尝试访问泛型类中的特定字段 我尝试过各种可能的解决方案——我遇到的问题是,我不知道如何通知Kotlin我传递的类中存在字段名 这是我的班级:-Class Kotlin泛型类,class,generics,kotlin,Class,Generics,Kotlin,我是Kotlin的新手,正在尝试访问泛型类中的特定字段 我尝试过各种可能的解决方案——我遇到的问题是,我不知道如何通知Kotlin我传递的类中存在字段名 这是我的班级:- @Entity(tableName = "coursemark_table") @Parcelize class CourseMark( @field:PrimaryKey @field:ColumnInfo(name = "coursemark_number") var number: Int,
@Entity(tableName = "coursemark_table")
@Parcelize
class CourseMark(
@field:PrimaryKey
@field:ColumnInfo(name = "coursemark_number")
var number: Int,
var name: String,
var latitude: String,
var longitude: String,
var passTo: String
): Parcelable
这是我试图初始化的通用列表适配器类-我不知道如何在OnBindViewHolder函数中找到CourseMark中的name字段,我可以理解为什么BaseListHolder在初始化之前不知道CourseMark中的字段名,但必须有一种方法告诉Kotlin编译器这一点字段存在-我很抱歉发布此消息,但我已经挣扎了好几天才能弄清楚这一点:-
abstract class BaseListAdapter<T> internal constructor(context: Context) :
RecyclerView.Adapter<BaseListAdapter<T>.BaseViewHolder>() {
private val mInflater: LayoutInflater = LayoutInflater.from(context)
private var mMarks = emptyList<T>() // Cached copy of marks
inner class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val markItemView: TextView = itemView.findViewById(R.id.textView)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
val itemView = mInflater.inflate(R.layout.recyclerview_coursemark, parent, false)
return BaseViewHolder(itemView)
}
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
val current = mMarks[position]
holder.markItemView.text = current.name
}
/**
* Associate a list of marks with this adapter
*/
internal fun setMarks(marks: List<T>) {
mMarks = marks
notifyDataSetChanged()
}
// getItemCount() is called many times, and when it is first called,
// mMarks has not been updated (means initially, it's null, and we can't return null).
override fun getItemCount(): Int {
return mMarks.size
}
/**
* Get the mark at a given position.
* This method is useful for identifying which mark
* was clicked or swiped in methods that handle user events.
*
* @param position
* @return The mark at the given position
*/
fun getMarkAtPosition(position: Int): T {
return mMarks[position]
}
}
最好是使用指定的类型CourseMark实现RecyclerView.Adapter。我不清楚为什么你要保持你的适配器通用,当你膨胀一个布局,看起来它是特定于类CourseMark 但是,如果您确实希望保持这种通用性,可以在onBindViewHolder方法中利用Kotlin的智能转换:
埃利-非常感谢你这么做-你可以看到,我对科特林很陌生,我会接受你的评论。太好了。如果这解决了你的问题,别忘了投票并接受答案!
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
val current = mMarks[position]
if(current is CourseMark){
holder.markItemView.text = current.name
}
}