#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 для каждого объекта в списке сообщений и получать сведения о пользователе в адаптере.