когда я отправляю сообщение пользователю, подобному Сераджу, сообщение обновляется в виде в обзоре + метка времени. Но строка данных seraj не занимает верхнюю позицию в списке повторного просмотра.
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) {
}
класс 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) {
}
})
}
}