Невозможно получить сообщения от другого пользователя FirebaseDatabase - PullRequest
0 голосов
/ 15 мая 2019

Это простое приложение для обмена сообщениями в чате, использующее базу данных Firebase Realtime и аутентификацию. Я успешно создал базу данных, но не могу получить сообщение от одного пользователя другому. Потому что, когда я отправляю сообщение / нажимаю кнопку отправки, он создает разные узлы, я думаю, что это строковый узел с кавычкой в ​​имени. Структура узла, которую я создал, - это user-messages -> fromId (текущий uid пользователя) -> toUid (которому отправляются сообщения).

Чтобы сделать более ясное объяснение, это скриншот того, что произошло. This is when I send message from the first user.Send message from the second user.

Я думаю, что проблема в том, что он создает разные узлы с "uid", что означает строку Таким образом, в базе данных есть два узла, один с «...», а другой - обычный. Для некоторой информации я использую некоторую библиотеку, такую ​​как загрузка изображений Picasso, groupie и parcelize.

Это исходный код ChatLogActivity

import...

class ChatLogActivity : AppCompatActivity() {

companion object {
    val TAG = "ChatLog"
}

val adapter = GroupAdapter<ViewHolder>()
var toUser: User? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_chat_log)
    recyclerview_chat_log.adapter = adapter
    toUser = intent.getParcelableExtra(NewMessageActivity.USER_KEY)
    titleChatLog.text = toUser?.nama

    listenForMessages()
    arrowBack.setOnClickListener {
        finish()
    }

    send_button_chat_log.setOnClickListener {
        Log.d(TAG, "Attempt to send message.....")
        performSendMessage()
    }
}

private fun listenForMessages() {
    val fromId = FirebaseAuth.getInstance().uid
    val toId = toUser?.uid
    val ref = FirebaseDatabase.getInstance().getReference("/user-messages/$fromId/$toId")
    ref.addChildEventListener(object : ChildEventListener {
        override fun onChildAdded(p0: DataSnapshot, p1: String?) {
            val chatMessage = p0.getValue(ChatMessage::class.java)
            if (chatMessage != null) {
                Log.d(TAG, chatMessage.text)
                if (chatMessage.fromId == FirebaseAuth.getInstance().uid) {
                    val currentUser = LatestMessageActivity.currentUser?: return
                    adapter.add(ChatFromItem(chatMessage.text, currentUser))
                } else {
                    adapter.add(ChatToItem(chatMessage.text, toUser!!))
                }
            }
        }

        override fun onCancelled(p0: DatabaseError) {

        }

        override fun onChildChanged(p0: DataSnapshot, p1: String?) {

        }

        override fun onChildMoved(p0: DataSnapshot, p1: String?) {

        }

        override fun onChildRemoved(p0: DataSnapshot) {

        }
    })
}

private fun performSendMessage() {
    val text = edittext_chat_log.text.toString()
    val fromId = FirebaseAuth.getInstance().uid
    val user = intent.getParcelableExtra<User>(NewMessageActivity.USER_KEY)
    val toId = user.uid
    val ref = FirebaseDatabase.getInstance().getReference("/user-messages/$fromId/$toId").push()
    val toRef = FirebaseDatabase.getInstance().getReference("/user-messages/$toId/$fromId ").push()
    if (fromId == null) return

    val chatMessage = ChatMessage(ref.key!!, text, fromId, toId, System.currentTimeMillis() / 1000)
    ref.setValue(chatMessage)
        .addOnSuccessListener {
            Log.d(TAG, "Save our chat message: ${ref.key}")
            edittext_chat_log.text.clear()
            recyclerview_chat_log.scrollToPosition(adapter.itemCount - 1)
        }
    toRef.setValue(chatMessage)
}
}

class ChatFromItem(val text: String, val user: User) : Item<ViewHolder>() {
override fun getLayout(): Int {
    return R.layout.chat_from_row
}

override fun bind(viewHolder: ViewHolder, position: Int) {
    val uri = user.profileImageUrl
    val targetImageView = viewHolder.itemView.imageViewFrom
    Picasso.get().load(uri).into(targetImageView)
    viewHolder.itemView.textViewFrom.text = text
}
}

class ChatToItem(val text: String, val user: User) : Item<ViewHolder>() {
override fun getLayout(): Int {
    return R.layout.chat_to_row
}

override fun bind(viewHolder: ViewHolder, position: Int) {
    val uri = user.profileImageUrl
    val targetImageView = viewHolder.itemView.imageViewTo
    Picasso.get().load(uri).into(targetImageView)
    viewHolder.itemView.textViewTo.text = text
}
}

А это ChatMessage, класс, в котором хранятся сообщения.

class ChatMessage(val id:String, val text: String, val fromId: String, val toId: String, val timeStamp: Long) {
constructor(): this("", "", "", "", -1)
}

Я очень рад, если кто-нибудь может помочь с этой проблемой. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...