Kotlin общие классы - PullRequest
0 голосов
/ 02 июля 2019

Я новичок в Kotlin и пытаюсь получить доступ к определенному полю в общем классе

Я испробовал всевозможные потенциальные решения - у меня проблема в том, что я не знаю, как сообщить Kotlin, что имя поля в классе, который я передаю, существует.

Это мой класс: -

@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

Это класс адаптера общего списка, который я пытаюсь инициализировать - я не могу понять, как получить поле имени в CourseMark в функции OnBindViewHolder, я могу понять, почему, поскольку 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]
    }

}

1 Ответ

1 голос
/ 02 июля 2019

Лучше всего реализовать RecyclerView.Adapter с указанным типом CourseMark. Мне непонятно, почему вы придерживаетесь универсального адаптера, когда вы надуваете макет, который выглядит как специфичный для класса CourseMark.

Если, однако, вы действительно хотите сохранить этот универсальный тип, вы можете использовать умный кастинг Kotlin в своем методе onBindViewHolder:

override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
    val current = mMarks[position]
    if(current is CourseMark){
         holder.markItemView.text = current.name
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...