首页 > 解决方案 > 如何按值对 Recyclerview 的 Firebase 实时数据库 HashMap 数据进行排序?

问题描述

我正在制作一个在 Horizo​​ntal Recyclerview 中显示短片的应用程序。现在我正在 Recyclerview 中填充所有短片,但我想通过“rankOrder”对它们进行排序。

我将 dataSnapshot 作为 HashMap 获取,并且我知道 HashMap 没有排序。我已经尝试过map.toList().sortedby....,比较器和很多其他的东西,但我不知道如何按“rankOrder”对我的 recyclerview 进行排序

有人能帮我吗?我希望我的 recyclerview 中的短片按“rankOrder”排序。“rankOrder”是一个 Int。

我正在使用科特林。我对此有点陌生,所以请详细解释一下。

这是我的“HomeView.kt”

val originalStart =  trendingMoviesDB.addListenerForSingleValueEvent(object : ValueEventListener {
   override fun onDataChange(dataSnapshot: DataSnapshot) {
       //get Channel IDs
       for (ChannelIDs in dataSnapshot.children) {
           val channelID = ChannelIDs.key!!

           trendingMoviesDB.child(channelID).addListenerForSingleValueEvent(object :
               ValueEventListener {
               override fun onDataChange(dataSnapshot: DataSnapshot) {

                   //get Channel Names
                   for (ChannelNames in dataSnapshot.children) {
                       val channelName = ChannelNames.key!!
                       trendingMoviesDB.child(channelID).child(channelName)
                           .addListenerForSingleValueEvent(
                               object : ValueEventListener {
                                   override fun onDataChange(dataSnapshot: DataSnapshot) {

  for (MovieID in dataSnapshot.children) {
   val movieID = MovieID.key!!

   trendingMoviesDB.child(channelID).child(channelName).child(movieID).orderByChild("rankOrder")
       .addListenerForSingleValueEvent(object : ValueEventListener {
               override fun onDataChange(dataSnapshot: DataSnapshot) {

                   val map: HashMap<String, Any> =
                       dataSnapshot.value as HashMap<String, Any>

                   val mTitle = map["movieTitle"] as String
                   val mMovieFeaturePhoto = map["movieFeaturePhoto"] as String
                   val mChannelId = map["channelID"] as String
                   val mChannelName = map["channelName"] as String
                   val mMovieID = map["movieID"] as String
                   val mMovieDescription = map["movieDescription"] as String
                   val mMovieUrl = map["movieURL"] as String
                   val mMovieCredits = map["movieCredits"] as String
                   val mTimeStamp = map["timeStamp"] as Int
                   val mRankOrder = map["rankOrder"] as Int

                   fvOriginals.addAll(
                       listOf(
                           TrendingMoviesModel(
                               movieTitle = mTitle,
                               movieFeaturePhoto = mMovieFeaturePhoto,
                               movieDescription = mMovieDescription,
                               movieCredits = mMovieCredits,
                               channelName = mChannelName,
                               channelID = mChannelId,
                               movieURL = mMovieUrl,
                               movieID = mMovieID,
                               rankOrder = mRankOrder,
                               timeStamp = mTimeStamp

                           )
                       )
                   )

                   originalsAdapter.notifyDataSetChanged()

               }

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

这是我的 RecyclerAdapter:


class TrendingMovieAdapter(val context: Context, private val fvOriginals: List<TrendingMoviesModel>): RecyclerView.Adapter<TrendingMovieAdapter.ViewHolder>() {


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(TrendingMovieCellBinding.inflate(LayoutInflater.from(parent.context),parent,false))

    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(fvOriginals[position])

        holder.itemView.setOnClickListener {
            val model = fvOriginals[position]
            var gMovieTitle : String = model.movieTitle
            var gMovieFeaturePhoto : String = model.movieFeaturePhoto
            var gMovieDesc : String = model.movieDescription
            var gChannelID : String = model.channelID
            var gChannelName : String = model.channelName
            var gMovieID : String = model.movieID
            var gMovieCredits : String = model.movieCredits
            var gMovieUrl : String = model.movieURL


            val intent = Intent(context,MovieDetailActivity::class.java)

            intent.putExtra("iMovieTitle", gMovieTitle)
            intent.putExtra("iMovieFeaturePhoto", gMovieFeaturePhoto)
            intent.putExtra("iMovieDesc", gMovieDesc)
            intent.putExtra("iChannelID", gChannelID)
            intent.putExtra("iChannelName",gChannelName)
            intent.putExtra("iMovieID", gMovieID)
            intent.putExtra("iMovieCredits",gMovieCredits)
            intent.putExtra("iMovieUrl", gMovieUrl)
            context.startActivity(intent)

        }

    }

    override fun getItemCount() = fvOriginals.size
    
    inner class ViewHolder(private val binding: TrendingMovieCellBinding) : RecyclerView.ViewHolder(binding.root) {

        fun bind(trendingMoviesModel: TrendingMoviesModel) {
                binding.movieTitle.text = trendingMoviesModel.movieTitle
            Glide.with(context).load(trendingMoviesModel.movieFeaturePhoto).into(binding.trendingMoviePoster)


        }
    }

}

这是我的模型类:

 data class TrendingMoviesModel(
     var channelID: String = "",
     var channelName: String = "",
     var movieID: String = "",
     var movieFeaturePhoto: String = "",
     var movieTitle: String = "",
     var movieDescription: String,
     var movieURL: String = "",
     var movieCredits: String = "",
     var rankOrder: Int = 0,
     var timeStamp: Int = 0
 )

以下是我的数据在 Firebase 实时数据库中的结构:

实时数据库结构

标签: androidfirebase-realtime-databaseandroid-recyclerview

解决方案


推荐阅读