#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. Привет @Джоффри, спасибо тебе за помощь. Я попробую это сделать и дам тебе знать. Я надеюсь, что смогу. 🙂