Пожалуйста, помогите kotlin ошибка «Для параметра не передано значение»

#kotlin

Вопрос:

У меня есть приложение для чата. Но я получаю такую ошибку в адаптерах. Ошибка: Для параметра «itemView2» не передано значение. Я пытаюсь отобразить элемент с именем itemView2 на странице xml. Я не очень хорошо владею языком Котлин. Вот почему мне нужна помощь.

Это MessagingAdapter.kt

 class MessagingAdapter(private val messages: OrderedRealmCollection<Message>, autoUpdate: Boolean,
                   private val context: Context, private val lifecycleOwner: LifecycleOwner, var user: User, private val myThumbImg: String,
                   private val selectedItems: LiveData<List<Message>>,
                   private val progressMap: LiveData<Map<String, Int>>, private val audibleState: LiveData<Map<String, AudibleState>>)

: RealmRecyclerViewAdapter<Message, RecyclerView.ViewHolder>(messages, autoUpdate)
    , StickyHeaderAdapter<RecyclerView.ViewHolder> {

private val interaction = context as? Interaction?
private val contactHolderInteraction = context as? ContactHolderInteraction?
private val audibleHolderInteraction = context as? AudibleInteraction?

//timestamps to implement the date header
var timestamps = HashMap<Int, Long>()
var lastTimestampPos = 0


//date header
override fun getHeaderId(position: Int): Long {
    return if (timestamps.containsKey(position)) {
        timestamps[position] ?: 0
    } else 0
}

//date header
override fun onCreateHeaderViewHolder(parent: ViewGroup): RecyclerView.ViewHolder? {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.row_day, parent, false)
    return HeaderHolder(view)
}

//date header
override fun onBindHeaderViewHolder(viewholder: RecyclerView.ViewHolder?, position: Int) {
    val mHolder = viewholder as HeaderHolder?

    //if there are no timestamps in this day then hide the header
    //otherwise show it
    val headerId = getHeaderId(position)
    if (headerId == 0L) mHolder?.header?.visibility = View.GONE else {
        val formatted = TimeHelper.getChatTime(headerId)
        mHolder?.header?.text = formatted
    }
}

override fun getItemCount() = messages.size


override fun getItemViewType(position: Int): Int {
    val message = messages[position]
    return message.type
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    // check the type of view and return holder
    return getHolderByType(parent, viewType)
}

override fun onBindViewHolder(mHolder: RecyclerView.ViewHolder, position: Int) {

    //get itemView type
    val type = getItemViewType(position)
    val message = messages[position]



    when (type) {
        MessageType.SENT_TEXT -> {
            val sentTextHolder = mHolder as SentTextHolder
            initHolder(sentTextHolder)
            sentTextHolder.bind(message, user)
        }
        MessageType.SENT_IMAGE -> {
            val sentImageHolder = mHolder as SentImageHolder
            initHolder(sentImageHolder)
            sentImageHolder.bind(message, user)
        }
        MessageType.SENT_VOICE_MESSAGE -> {
            val sentVoiceMessageHolder = mHolder as SentVoiceMessageHolder
            initHolder(sentVoiceMessageHolder)
            initAudibleHolder(sentVoiceMessageHolder)
            sentVoiceMessageHolder.bind(message, user)
        }
        MessageType.SENT_VIDEO -> {
            val sentVideoMessageHolder = mHolder as SentVideoMessageHolder
            initHolder(sentVideoMessageHolder)
            sentVideoMessageHolder.bind(message, user)
        }
        MessageType.SENT_FILE -> {
            val sentFileHolder = mHolder as SentFileHolder
            initHolder(sentFileHolder)
            sentFileHolder.bind(message, user)
        }
        MessageType.SENT_AUDIO -> {
            val sentAudioHolder = mHolder as SentAudioHolder
            initHolder(sentAudioHolder)
            initAudibleHolder(sentAudioHolder)
            sentAudioHolder.bind(message, user)
        }
        MessageType.SENT_CONTACT -> {
            val sentContactHolder = mHolder as SentContactHolder
            initHolder(sentContactHolder)
            initContactHolder(sentContactHolder)
            sentContactHolder.bind(message, user)
        }

        MessageType.SENT_LOCATION -> {
            val sentLocationHolder = mHolder as SentLocationHolder
            initHolder(sentLocationHolder)
            sentLocationHolder.bind(message, user)
        }

        MessageType.SENT_STICKER -> {
            val sentStickerHolder = mHolder as SentStickerHolder
            initHolder(sentStickerHolder)
            sentStickerHolder.bind(message, user)
        }

        MessageType.RECEIVED_TEXT -> {
            val holder = mHolder as ReceivedTextHolder
            initHolder(holder)
            holder.bind(message, user)
        }
        MessageType.RECEIVED_IMAGE -> {
            val receivedImageHolder = mHolder as ReceivedImageHolder
            initHolder(receivedImageHolder)
            receivedImageHolder.bind(message, user)
        }
        MessageType.RECEIVED_VOICE_MESSAGE -> {
            val receivedVoiceMessageHolder = mHolder as ReceivedVoiceMessageHolder
            initHolder(receivedVoiceMessageHolder)
            initAudibleHolder(receivedVoiceMessageHolder)
            receivedVoiceMessageHolder.bind(message, user)
        }
        MessageType.RECEIVED_VIDEO -> {
            val receivedVideoMessageHolder = mHolder as ReceivedVideoMessageHolder
            initHolder(receivedVideoMessageHolder)
            receivedVideoMessageHolder.bind(message, user)
        }
        MessageType.RECEIVED_FILE -> {
            val receivedFileHolder = mHolder as ReceivedFileHolder
            initHolder(receivedFileHolder)
            receivedFileHolder.bind(message, user)
        }
        MessageType.RECEIVED_AUDIO -> {
            val receivedAudioHolder = mHolder as ReceivedAudioHolder
            initHolder(receivedAudioHolder)
            initAudibleHolder(receivedAudioHolder)
            receivedAudioHolder.bind(message, user)
        }
        MessageType.RECEIVED_CONTACT -> {
            val receivedContactHolder = mHolder as ReceivedContactHolder
            initHolder(receivedContactHolder)
            initContactHolder(receivedContactHolder)
            receivedContactHolder.bind(message, user)
        }
        MessageType.RECEIVED_LOCATION -> {
            val receivedLocationHolder = mHolder as ReceivedLocationHolder
            initHolder(receivedLocationHolder)
            receivedLocationHolder.bind(message, user)
        }
        MessageType.SENT_DELETED_MESSAGE -> {
            val sentDeletedMessageHolder = mHolder as SentDeletedMessageHolder
            sentDeletedMessageHolder.bind(message, user)
        }
        MessageType.RECEIVED_DELETED_MESSAGE -> {
            val receivedDeletedMessageHolder = mHolder as ReceivedDeletedMessageHolder
            receivedDeletedMessageHolder.bind(message, user)
        }
        MessageType.GROUP_EVENT -> {
            val groupEventHolder = mHolder as GroupEventHolder
            groupEventHolder.bind(message, user)
        }
        MessageType.RECEIVED_STICKER -> {
            val receivedStickerHolder = mHolder as ReceivedStickerHolder
            initHolder(receivedStickerHolder)
            receivedStickerHolder.bind(message, user)
        }
        else -> {
            val notSupportedTypeHolder = mHolder as? NotSupportedTypeHolder
            notSupportedTypeHolder?.bind(message, user)
        }
    }
}

private fun initHolder(baseHolder: BaseHolder) {
    baseHolder.selectedItems = selectedItems
    baseHolder.progressMap = progressMap
    baseHolder.lifecycleOwner = lifecycleOwner
    baseHolder.interaction = interaction
}

private fun initAudibleHolder(audibleBase: AudibleBase) {
    audibleBase.audibleInteraction = audibleHolderInteraction
    audibleBase.audibleState = audibleState
}

private fun initContactHolder(contactHolderBase: ContactHolderBase) {
    contactHolderBase.contactHolderInteraction = contactHolderInteraction
}


private fun distinctMessagesTimestamps() {

    for (i in messages.indices) {
        val timestamp = messages[i].timestamp.toLong()
        if (i == 0) {
            timestamps[i] = timestamp
            lastTimestampPos = i
        } else {
            val oldTimestamp = messages[i - 1].timestamp.toLong()
            if (!TimeHelper.isSameDay(timestamp, oldTimestamp)) {
                timestamps[i] = timestamp
                lastTimestampPos = i
            }
        }

    }

}

//update timestamps if needed when a new message inserted
fun messageInserted() {
    val index = messages.size - 1
    val newTimestamp = messages[index].timestamp.toLong()
    if (timestamps.isEmpty()) {
        timestamps[index] = newTimestamp
        lastTimestampPos = index
        return
    }
    val lastTimestamp = timestamps[lastTimestampPos]!!
    if (!TimeHelper.isSameDay(lastTimestamp, newTimestamp)) {
        timestamps[index] = newTimestamp
        lastTimestampPos = index
    }
}


private fun getHolderByType(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    when (viewType) {
        MessageType.DAY_ROW -> return TimestampHolder(LayoutInflater.from(parent.context).inflate(R.layout.row_day, parent, false))
        MessageType.SENT_DELETED_MESSAGE -> return SentDeletedMessageHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_sent_deleted_message, parent, false))
        MessageType.RECEIVED_DELETED_MESSAGE -> return ReceivedDeletedMessageHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_received_deleted_message, parent, false))
        MessageType.SENT_TEXT -> return SentTextHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_sent_message_text, parent, false))
        MessageType.SENT_IMAGE -> return SentImageHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_sent_message_img, parent, false))
        MessageType.RECEIVED_TEXT -> return ReceivedTextHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_received_message_text, parent, false)) //ERROR HERE
        MessageType.RECEIVED_IMAGE -> return ReceivedImageHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_received_message_img, parent, false))
        MessageType.SENT_VOICE_MESSAGE -> return SentVoiceMessageHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_sent_voice_message, parent, false), myThumbImg)
        MessageType.RECEIVED_VOICE_MESSAGE -> return ReceivedVoiceMessageHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_received_message_voice, parent, false))
        MessageType.RECEIVED_VIDEO -> return ReceivedVideoMessageHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_received_message_video, parent, false))
        MessageType.SENT_VIDEO -> return SentVideoMessageHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_sent_message_video, parent, false))
        MessageType.SENT_FILE -> return SentFileHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_sent_file, parent, false))
        MessageType.RECEIVED_FILE -> return ReceivedFileHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_received_file, parent, false))
        MessageType.SENT_AUDIO -> return SentAudioHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_sent_audio, parent, false))
        MessageType.RECEIVED_AUDIO -> return ReceivedAudioHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_received_audio, parent, false))
        MessageType.SENT_CONTACT -> return SentContactHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_sent_contact, parent, false))
        MessageType.RECEIVED_CONTACT -> return ReceivedContactHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_received_contact, parent, false))
        MessageType.SENT_LOCATION -> return SentLocationHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_sent_location, parent, false))
        MessageType.RECEIVED_LOCATION -> return ReceivedLocationHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_received_location, parent, false))
        MessageType.GROUP_EVENT -> return GroupEventHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_group_event, parent, false))
        MessageType.SENT_STICKER -> return SentStickerHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_sent_sticker, parent, false))
        MessageType.RECEIVED_STICKER -> return ReceivedStickerHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_received_sticker, parent, false))
    }
    return NotSupportedTypeHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_not_supported, parent, false))
}


init {
    distinctMessagesTimestamps()
}
 

}

Это receivedтекстхолдер.kt

 class ReceivedTextHolder(context: Context, itemView: View,itemView2: View) : BaseReceivedHolder(context,itemView) {

private var tvMessageContent: AXEmojiTextView = itemView.findViewById(R.id.tv_message_content)
private val circleImg: CircleImageView = itemView2.findViewById<View>(R.id.voice_circle_img_text) as CircleImageView

override fun bind(message: Message,user: User) {
    super.bind(message,user)
    tvMessageContent.text = message.content
    loadUserPhoto(user,message.fromId, circleImg)
}
private fun loadUserPhoto(user:User,fromId: String, imageView: ImageView) {

    //if it's a group load the user image
    if (user.isGroupBool amp;amp; user.group.users != null) {
        val mUser = ListUtil.getUserById(fromId, user.group.users)
        if (mUser != null amp;amp; mUser.thumbImg != null) {
            Glide.with(context).load(mUser.thumbImg).into(imageView)
        }
    } else {
        if (user.thumbImg != null) Glide.with(context).load(user.thumbImg).into(imageView)
    }
}
 

}

Пожалуйста, помогите, ребята 🙁 То, что я пытаюсь сделать, это отобразить элемент с именем itemView2 на странице xml.

Ответ №1:

Ошибка означает , что вы пытаетесь вызвать функцию, которая запрашивает имя параметра itemView2 , но вы не передали этот параметр. Обычно это происходит, когда вы предоставляете слишком мало аргументов при вызове метода.

В данном конкретном случае рассматриваемый метод на самом деле является конструктором ReceivedTextHolder . Как вы можете видеть, конструктор объявлен принимающим 3 параметра ( context , itemView , и itemView2 ):

 class ReceivedTextHolder(context: Context, itemView: View,itemView2: View)
 

Но когда вы вызываете этот конструктор, вы даете только 2 аргумента:

 return ReceivedTextHolder(context, LayoutInflater.from(parent.context).inflate(R.layout.row_received_message_text, parent, false)) //ERROR HERE
 

Здесь первый аргумент ( context ) получает значение context , а второй аргумент ( itemView ) получает значение выражения:

 LayoutInflater.from(parent.context).inflate(R.layout.row_received_message_text, parent, false)
 

Но вы упускаете 3-й аргумент. 3-й, вероятно, будет выглядеть как 2-й. Вам просто нужно найти и раздуть правильный вид для этого.

Комментарии:

1. Привет @Джоффри, спасибо тебе за помощь. Я попробую это сделать и дам тебе знать. Я надеюсь, что смогу. 🙂