kotlin 如何在mvvm体系结构中按值对从firebase获取的recyclerview数据进行排序

carvr3hs  于 2022-12-04  发布在  Kotlin
关注(0)|答案(2)|浏览(147)

我正在尝试根据使用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)。每个通知都有一个任务日期。现在我尝试根据任务日期对通知进行排序,这意味着任务日期越接近今天的日期,在回收程序视图中将首先显示。或者,给定任务日期最晚的通知将首先显示在回收程序视图中。

frebpwbc

frebpwbc1#

在MVVM体系结构中,对从Firebase中提取的recyclerview数据进行排序的最佳方式是使用自定义比较器。您可以定义一个比较器,它接受两个对象(在您的情况下,是两个Firebase数据对象)并比较它们的值。然后,您可以使用此比较器对Firebase数据对象列表进行排序,然后再将其用于填充RecyclerView。
是的,下面是一个自定义比较器的示例,该比较器根据两个Firebase数据对象的“name”字段进行比较:

public class FirebaseDataComparator implements Comparator<FirebaseData> {
    @Override
    public int compare(FirebaseData o1, FirebaseData o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

然后,您可以使用此比较器对Firebase数据对象列表进行排序,然后再使用它填充RecyclerView:
List dataList =...//获取Firebase数据对象列表
(dataList,新的FirebaseDataComparator());
//使用dataList填充回收视图

ltskdhd1

ltskdhd12#

正如hassan bazai所说,我遵循了比较两个日期的相同概念

class FirebaseDataComparator : Comparator<GroupNoticeData?> {
    override fun compare(p0: GroupNoticeData?, p1: GroupNoticeData?): Int {

        val dateFormat = SimpleDateFormat("dd/MM/yyyy")

        val firstDate: Date = dateFormat.parse(p0?.taskdate!!) as Date
        val secondDate: Date = dateFormat.parse(p1?.taskdate!!) as Date

        return firstDate.compareTo(secondDate)
    }
}

这里groupNoticeData是我用来填充回收器视图中的数据的数据类,并从中提取了两个对象。相应地解析了它们的日期格式,然后比较了它们。在添加数据之前,我在recyclerViewAdapter中使用比较器类对它们进行了排序,然后添加了它们。这里是我必须使用比较器类的部分。

fun updateNoticeList(notices: List<GroupNoticeData>) {
        Collections.sort(notices, FirebaseDataComparator())
        this.tasks.clear()
        this.tasks.addAll(notices)

        notifyDataSetChanged()

    }

相关问题