Представление Recycler с несколькими типами представлений, kotlin и sqlite - PullRequest
1 голос
/ 30 июня 2019

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

Я видел несколько примеров с несколькими решениями.но я новичок и ява не очень хороша, так как я изучаю андроид студию с kotlin.

Я попробовал:

Расширение держателя представления переработчика

-Я не смог продолжить, потому чтоЯ не понял java-код.

с использованием BaseViewHolder

- у меня возникли проблемы с типом возвращаемого значения модуля onCreateViewHolder и с объявлением держателей вида, поэтому я не смог сделать это, как в примерахЯ нашел

Я думаю, что мой getItemViewType работает, где я добавляю одну 1 строку с id = -10 после курсора в dbhandler, чтобы получить другой тип представления в конце списка.

override fun getItemViewType(position: Int) :Int  {
        return if (list[position].id.toInt() == -10 ){
            VIEW_TYPE_FOLLOWER
        }else{
            VIEW_TYPE_HEADER
        }
    }

У меня много сомнений по поводу onCreateViewHolder, когда я пытаюсь вернуть ViewHolder и ViewHolder2, я получаю ошибки, так что это мой рабочий просмотрщик.

override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder {
        val v = LayoutInflater.from(p0.context).inflate(R.layout.list_layout, p0 , false)
        return ViewHolder(v)
    }

держатель представления

class ViewHolder(itemView: View) :RecyclerView.ViewHolder(itemView){
        val textViewName = itemView.findViewById(R.id.textViewName)as TextView
        val textViewNameEdit = itemView.findViewById(R.id.textViewNameEdit)as EditText
        val textViewAddress = itemView.findViewById(R.id.priorityLevel) as TextView

        val notas = itemView.findViewById(R.id.notas) as TextView
    }

Я хочу, чтобы другой тип представления в конце сделал его кнопкой.

1 Ответ

2 голосов
/ 30 июня 2019

первый шаг должен быть объявлен как поле в адаптере, как blew

private val EMPTY_ITEM = 0
private val NORMAL_ITEM = 1

Итак, следующим шагом вы должны создать два экземпляра типа viewHolder

inner class MyViewHolder(itemView: View) : ViewHolder(itemView) {
    var title: TextView = itemView.item_text

}

inner class EmptyMyViewHolder(itemView: View) : ViewHolder(itemView) {
    var titleEmpty: TextView = itemView.item_empty_text
}

и создайте новый экземпляр, подходящий viewHolder

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val inflater = LayoutInflater.from(parent.context)
    return if (viewType == NORMAL_ITEM) {
        val v = inflater.inflate(R.layout.item, parent, false)
        vh = MyViewHolder(v)
        vh as MyViewHolder
    } else {
        val v = inflater.inflate(R.layout.item_empty, parent, false)
        vh = EmptyMyViewHolder(v)
        vh as EmptyMyViewHolder
    }
}

не забудьте переопределить getItemViewType

override fun getItemViewType(position: Int): Int {
    return when (getItems()[position]) {
        is EmptySampleModel -> EMPTY_ITEM
        else -> NORMAL_ITEM
    }
}

последний шаг привязать элемент с подходящими данными

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    when (holder) {
        is MyViewHolder -> {
            vh = holder
            val model = getItems()[position] as SampleModel
            (vh as MyViewHolder).title.text = model.getId().toString()
        }
        else -> {
            vh = holder
            val model = getItems()[position] as EmptySampleModel
            (vh as EmptyMyViewHolder).titleEmpty.text = model.getText()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...