如何在具有firebase的kotlin的recyclerview中从最高位置的用户处获取最新消息

问题描述 投票:0回答:1

当我向Seraj之类的用户发送消息时,该消息会在recyclerview +时间戳中进行更新。但是,seraj数据行不在recyclerview列表的顶部。

class LatestActivity : AppCompatActivity() {

    val adapter = GroupAdapter<com.xwray.groupie.GroupieViewHolder>()

    companion object{
        var currentUser : User? = null
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_latest)

//        recyclerview_lattestMessageActivity.isNestedScrollingEnabled = true
        recyclerview_lattestMessageActivity.setHasFixedSize(true)

        recyclerview_lattestMessageActivity.adapter = adapter

        val Layout_Manager = LinearLayoutManager(this)
//        Layout_Manager.stackFromEnd  = true
//        Layout_Manager.reverseLayout = true

        recyclerview_lattestMessageActivity.layoutManager = Layout_Manager
        Layout_Manager.findLastVisibleItemPosition()


        val decoration = DividerItemDecoration(applicationContext, LinearLayoutManager.VERTICAL)
        decoration.setDrawable(ContextCompat.getDrawable(applicationContext, R.drawable.itemdecoration_by_line)!!)
        recyclerview_lattestMessageActivity.addItemDecoration(decoration)

        adapter.setOnItemClickListener { item, view ->
            val row = item as LattestMessageRow

            val intent = Intent(this, ChatLogActivity::class.java)
            intent.putExtra(New_Message_Activity.USER_KEY, row.chatPartnerUser)
            startActivity(intent)
        }

            fetchCurrentUser()
            verifyTheUserLoggedIn()
            ListenForLattestMessages()

        }


    val lattestMessageMap = HashMap<String, ChatMessage>()

    private fun ListenForLattestMessages(){


        val fromId =  FirebaseAuth.getInstance().uid
        val timestamp = System.currentTimeMillis()/1000
        val ref = FirebaseDatabase.getInstance().getReference("lattest-messages/$fromId")

        ref.addChildEventListener(object : ChildEventListener {

            override fun onChildChanged(dataSnapshot: DataSnapshot, previousChildName: String?) {
                dataSnapshot.getValue(ChatMessage::class.java)?.let {
                    lattestMessageMap[dataSnapshot.key!!] = it
                    refreshRecyclerViewMessages()
                }
            }
            override fun onChildAdded(dataSnapshot: DataSnapshot, previousChildName: String?) {
                dataSnapshot.getValue(ChatMessage::class.java)?.let {
                    lattestMessageMap[dataSnapshot.key!!] = it
                    refreshRecyclerViewMessages()
                }
            }

            override fun onCancelled(p0: DatabaseError) {
            }

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

            override fun onChildRemoved(p0: DataSnapshot) {
            }

        })

    }

    private fun refreshRecyclerViewMessages(){

        adapter.clear()

        lattestMessageMap.values.forEach {
            adapter.add(LattestMessageRow(it))
            adapter.notifyItemInserted(0)
        }

    }

    private fun fetchCurrentUser(){

        val uid = FirebaseAuth.getInstance().uid
        val ref = FirebaseDatabase.getInstance().getReference("/users/$uid")

        ref.addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onCancelled(p0: DatabaseError) {

            }

            override fun onDataChange(p0: DataSnapshot) {
                currentUser = p0.getValue(User::class.java)
                Log.d("LatestActivity", "The current user is : ${currentUser?.profile_image}")
            }
        })
    }

    private fun verifyTheUserLoggedIn() {

        val uid = FirebaseAuth.getInstance().uid
        if (uid == null) {

            val intent = Intent(this, MainActivity::class.java)
            intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
            startActivity(intent)
        }
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        when(item.itemId){
            R.id.new_message->{

                val intent = Intent(this, New_Message_Activity::class.java)
                startActivity(intent)

            }

            R.id.sign_out->{
                FirebaseAuth.getInstance().signOut()

                val intent = Intent(this, MainActivity::class.java)
                intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
                startActivity(intent)
            }

        }

        return super.onOptionsItemSelected(item)

    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.nav_menu,menu)
        return super.onCreateOptionsMenu(menu)
    }

}

private operator fun Boolean.invoke(b: Boolean) {

}

class LattestMessageRow

    class LattestMessageRow(val chatMessage: ChatMessage) : Item<GroupieViewHolder>(){

        var chatPartnerUser : com.example.myapplication.User? = null
        var testing_abc = DateUtils.getFormattedTime(chatMessage.timestamp)

        override fun getLayout(): Int {
            return R.layout.lattest_message_row
        }

        override fun bind(viewHolder:GroupieViewHolder, position: Int) {
        viewHolder.itemView.lattestMessage_textView_lattest_message_row.text = chatMessage.text


            val chatPartnerId : String

            if (chatMessage.sendFromId == FirebaseAuth.getInstance().uid){
                chatPartnerId = chatMessage.sendToId!!
            }

            else{
                chatPartnerId = chatMessage.sendFromId!!
            }

            val ref = FirebaseDatabase.getInstance().getReference("users/$chatPartnerId")
            ref.child("lattest-messages").orderByChild("timestamp")
//                orderByKey().equalTo("timestamp")
//                .orderByChild("timestamp")
            ref.addListenerForSingleValueEvent(object : ValueEventListener {
                override fun onDataChange(p0: DataSnapshot) {

                    val message: String = p0.child("timestamp").getValue().toString()

                    chatPartnerUser = p0.getValue(User::class.java)

                    viewHolder.itemView.username_textView_lattest_messages_row.text = chatPartnerUser?.username
                    viewHolder.itemView.latest_msg_time.text = testing_abc

                    val targetUserProfileImage = viewHolder.itemView.userimage_imageView_lattest_message_row
                    Picasso.get().load(chatPartnerUser?.profile_image).into(targetUserProfileImage)

                }

                override fun onCancelled(p0: DatabaseError) {
                }
            })

        }

    }
android firebase kotlin firebase-realtime-database
1个回答
0
投票

Collections.reverse(list);用于将数据作为lifo进行反向]

© www.soinside.com 2019 - 2024. All rights reserved.