Упорядочение списка пользователей на основе списка сообщений — Kotlin и Android

#android #sorting #kotlin #firebase-realtime-database

#Android #сортировка #kotlin #firebase-база данных в реальном времени

Вопрос:

Я пытаюсь отсортировать список пользовательских объектов по порядку, в котором идентификаторы пользователей отображаются в массиве MessageList. Список сообщений состоит из идентификаторов людей, с которыми пользователь общается (упорядоченных по времени с помощью sortwith), которые затем должны быть отправлены на пользовательский адаптер в виде списка пользователей в том же порядке, что и список сообщений. Это позволяет отображать имя пользователя, изображение профиля и другие сведения… Я узнал, что снимок данных пользователей из firebase предоставляет как есть порядок и, следовательно, его необходимо упорядочить снова..

Я попытался отсортировать список пользовательских массивов на основе списка сообщений, но у него есть проблемы с доступом к идентификатору (с просьбой сделать его общедоступным) и что конечный результат больше не является списком пользователей. Как бы вы продолжили демонстрировать упорядоченный по времени список сообщений?

Класс данных пользователей

 class Users {
private var uid: String = ""}
  

Класс данных MessageList

 class MessageList {
private var id: String = ""
private var chattimeStmp: Long = 0}
  

Функция, которая создает список пользователей на основе списка сообщений

 private var userMsgAdapter: UserMsgAdapter? = null
private var mUsers: List<Users>? = null
private var usersMsgList: List<MessageList>? = null
private var firebaseUser : FirebaseUser? = null
lateinit var recycler_view_msgList : RecyclerView

private fun retrieveMessageList()
    {
        mUsers = ArrayList()
        val ref = FirebaseDatabase.getInstance().reference.child("Users")
        ref.addValueEventListener(object : ValueEventListener {

            override fun onDataChange(p0: DataSnapshot) {
                (mUsers as ArrayList).clear()

                //sorting MessageList based on timestamp
                usersMsgList?.sortedBy { it.getChattimeStmp() }

                for (dataSnapshot in p0.children) {
                    val user = dataSnapshot.getValue(Users::class.java)
                    for (eachMessageList in usersMsgList!!) {
                        if (eachMessageList.getId()
                                .equals(user!!.getUID()) amp;amp; !firebaseUser?.uid.equals(
                                eachMessageList.getId()
                            )
                        ) {
                            (mUsers as ArrayList).add(user)
                        }
                    }
                }

                //Creating a map and sorting list based on the other
                val orderById = usersMsgList!!.withIndex().associate { it.value to it.index }
                val mSortedUsers = (mUsers as ArrayList<Users>).sortedBy { orderById[it.getUID()] }

                userMsgAdapter = UserMsgAdapter(context!!, mUsers as ArrayList<Users>, true)
                userMsgAdapter!!.notifyDataSetChanged()
                recycler_view_msgList.adapter = userMsgAdapter
            }

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

Ответ №1:

Лучшее решение в этом случае — не сортировать пользовательские объекты в соответствии с порядком их появления в списке сообщений, а напрямую вызывать представление recycler для каждого объекта в списке сообщений и получать сведения о пользователе в адаптере.