我正在尝试根据使用MVVM架构的子项的值对从firebase实时数据库中获取的数据进行排序,数据库引用在存储库中创建
组通知存储库
class GroupNoticeRepository(private var groupSelected: String) {
val auth = Firebase.auth
val user = auth.currentUser!!.uid
private val scheduleReference: DatabaseReference =
FirebaseDatabase.getInstance().getReference("group-notice").child(groupSelected)
@Volatile
private var INSTANCE: GroupNoticeRepository? = null
fun getInstance(): GroupNoticeRepository {
return INSTANCE ?: synchronized(this) {
val instance = GroupNoticeRepository(groupSelected)
INSTANCE = instance
instance
}
}
fun loadSchedules(allSchedules: MutableLiveData<List<GroupNoticeData>>) {
scheduleReference.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
try {
val scheduleList: List<GroupNoticeData> =
snapshot.children.map { dataSnapshot ->
dataSnapshot.getValue(GroupNoticeData::class.java)!!
}
allSchedules.postValue(scheduleList)
} catch (_: Exception) {
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
}
组通知片段
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recycler = binding.taskList
recycler.layoutManager = LinearLayoutManager(context)
recycler.setHasFixedSize(true)
adapter = GroupNoticeAdapter(_inflater)
recycler.adapter = adapter
viewModel = ViewModelProvider(this)[GroupNoticeViewModel::class.java]
viewModel.initialize(groupId)
viewModel.allSchedules.observe(viewLifecycleOwner) {
adapter!!.updateUserList(it)
}
}
组通知视图模型
class GroupNoticeViewModel : ViewModel() {
private lateinit var repository: GroupNoticeRepository
private val _allSchedules = MutableLiveData<List<GroupNoticeData>>()
val allSchedules: LiveData<List<GroupNoticeData>> = _allSchedules
fun initialize(groupSelected: String) {
repository = GroupNoticeRepository(groupSelected).getInstance()
repository.loadSchedules(_allSchedules)
}
}
的复数
如您所见,当前结构为组-通知-组ID(组)-通知ID(通知)-任务日期
在组通知下面有一些组,每个组中有一些通知(noticeId)。每个通知都有一个任务日期。现在我尝试根据任务日期对通知进行排序,这意味着任务日期越接近今天的日期,在回收程序视图中将首先显示。或者,给定任务日期最晚的通知将首先显示在回收程序视图中。
2条答案
按热度按时间frebpwbc1#
在MVVM体系结构中,对从Firebase中提取的recyclerview数据进行排序的最佳方式是使用自定义比较器。您可以定义一个比较器,它接受两个对象(在您的情况下,是两个Firebase数据对象)并比较它们的值。然后,您可以使用此比较器对Firebase数据对象列表进行排序,然后再将其用于填充RecyclerView。
是的,下面是一个自定义比较器的示例,该比较器根据两个Firebase数据对象的“name”字段进行比较:
然后,您可以使用此比较器对Firebase数据对象列表进行排序,然后再使用它填充RecyclerView:
List dataList =...//获取Firebase数据对象列表
(dataList,新的FirebaseDataComparator());
//使用dataList填充回收视图
ltskdhd12#
正如hassan bazai所说,我遵循了比较两个日期的相同概念
这里groupNoticeData是我用来填充回收器视图中的数据的数据类,并从中提取了两个对象。相应地解析了它们的日期格式,然后比较了它们。在添加数据之前,我在recyclerViewAdapter中使用比较器类对它们进行了排序,然后添加了它们。这里是我必须使用比较器类的部分。