【问题标题】:Kotlin Fragment Recyclerview not updatingKotlin Fragment Recyclerview 未更新
【发布时间】:2020-10-19 23:30:54
【问题描述】:

每当发送新消息时,我都希望更新回收站视图。日志以正确的顺序显示 uid,但视图并未反映这一点。我确实看到某处提到移动单个项目。我已经尝试过了,但无法让它正常工作。移动单个项目绝对是首选。我移动了recycler_view_chatlist.adapter = userAdapter 位以查看是否可行,但无济于事。我也有userAdapter!!.notifyDataSetChanged(),结果也一样。我尝试在我的 UserAdapter 中创建一个函数并从我的片段中调用它。我很茫然……

edit* 我在片段中添加了一些代码。

这是我的一些 ChatsFragment:

//edit
    @RequiresApi(Build.VERSION_CODES.O)
        private fun addMsg() {
            if (sortedMsg?.size!! >= 2) {
                sortedMsg?.union(sortedMsg!!)
            }
                sortMsg(sortedMsg)
                getUid()
                Log.d("ARRAY AFTER SORT", sortMsg(sortedMsg).toString())
        }    
    @RequiresApi(Build.VERSION_CODES.O)
    fun sortMsg(sortedMsg: List<String>?): List<String>? {
        Log.d("LAST ID", lastId)
            val dateTimeStrToLocalDateTime: (String) -> LocalDateTime = {
                LocalDateTime.parse(
                    it.substring(0, 26),
                    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSSSSS")
                )
            }
            val finalSort = sortedMsg?.sortedByDescending(dateTimeStrToLocalDateTime)
            return finalSort
    }
//end edit
    @RequiresApi(Build.VERSION_CODES.O)
        private fun getUid() {
            val userArray = ArrayList<String>()
            val firebaseUser = FirebaseAuth.getInstance().currentUser
            val reference = FirebaseDatabase.getInstance().reference.child("Chats")
            reference.addListenerForSingleValueEvent(object : ValueEventListener {
                @RequiresApi(Build.VERSION_CODES.O)
                override fun onDataChange(p0: DataSnapshot) {
                        for (item in sortMsg(sortedMsg)!!) {
                            val stringVal = p0.child(item).getValue(Chat::class.java)
                            Log.d("SET UID item", item)
                            if (stringVal != null) {
                                if (stringVal.getReceiver() != firebaseUser!!.uid) {
                                    userArray.add(stringVal.getReceiver()!!)
                                }
                                if (stringVal.getSender() != firebaseUser.uid) {
                                    userArray.add(stringVal.getSender()!!)
                                }
                            }
                        }
                        Log.d("USER ARRAY", userArray.toString())
                        setUid(userArray)
                }
    
                override fun onCancelled(p0: DatabaseError) {
                }
            })
        }
    
        private fun setUid(userArray: ArrayList<String>) {
            val latestMsgId = FirebaseDatabase.getInstance().reference.child("Users")
            latestMsgId.addValueEventListener(object : ValueEventListener {
                @RequiresApi(Build.VERSION_CODES.O)
                override fun onDataChange(p0: DataSnapshot) {
                    if (!executed) {
    
                        val user = p0.child(firebaseUser!!.uid).getValue(Users::class.java)
                        latestMsgId.child(firebaseUser!!.uid).child("lastMsg").setValue(userArray)
                        val sortedUsers = user?.getLastMsg()
    
                        Log.d("SORTED USERS", sortedUsers.toString())
    
                        for (item in sortedUsers!!) {
    
                            val uidVal = p0.child(item).getValue(Users::class.java)
                            uidArray.add(uidVal!!)
                            Log.d("UID VAL", uidVal.getUserName().toString())
                            executed = true
                        }
                    }
                    userAdapter = UserAdapter(p0, context!!, uidArray, true)
                    recycler_view_chatlist.adapter = userAdapter
                }
    
                override fun onCancelled(p0: DatabaseError) {
                }
            })
        }

这是用户适配器:

override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
    val view: View = LayoutInflater.from(mContext).inflate(
        R.layout.user_search_item_layout,
        viewGroup,
        false
    )
    return ViewHolder(view)
}

@RequiresApi(Build.VERSION_CODES.O)
override fun onBindViewHolder(holder: ViewHolder, i: Int) {
    val user: Users = mUsers[i]
    val userVisitId: String? = user.getUID()
    val firebaseUser = FirebaseAuth.getInstance().currentUser

    //use data from mUsers...

这是 Logcat:

2020-10-19 19:22:08.632 11190-11190/com.score.scorev2 W/ClassMapper: No setter/field for 2020-10-19 02:51:50:192000-MJylHpCC_Lf5aKy70vv found on class com.score.scorev2.ModelClasses.Chat
2020-10-19 19:22:08.633 11190-11190/com.score.scorev2 W/ClassMapper: No setter/field for 2020-10-19 03:37:43:137000-MJyvmw6URelqbe6Po-O found on class com.score.scorev2.ModelClasses.Chat
2020-10-19 19:22:08.633 11190-11190/com.score.scorev2 W/ClassMapper: No setter/field for 2020-10-19 03:32:45:371000-MJyueEPOCBKEV_gVI6z found on class com.score.scorev2.ModelClasses.Chat
2020-10-19 19:22:08.633 11190-11190/com.score.scorev2 W/ClassMapper: No setter/field for 2020-10-19 22:46:25:902000-MK21hTuH3sRADWn9HQz found on class com.score.scorev2.ModelClasses.Chat
2020-10-19 19:22:08.633 11190-11190/com.score.scorev2 W/ClassMapper: No setter/field for 2020-10-19 02:29:00:370000-MJyg3OZIxJtBRq1ZrKM found on class com.score.scorev2.ModelClasses.Chat
2020-10-19 19:22:08.633 11190-11190/com.score.scorev2 D/ARRAY BEFORE SORT: [2020-10-19 23:18:58:435000-MK299AVpBCKcPx_NdR0, 2020-10-19 23:18:50:285000-MK297B92yt4GeyYe8hn]
2020-10-19 19:22:08.640 11190-11190/com.score.scorev2 D/LAST ID: 2020-10-19 23:18:50:285000-MK297B92yt4GeyYe8hn
2020-10-19 19:22:08.658 11190-11190/com.score.scorev2 D/LAST ID: 2020-10-19 23:18:50:285000-MK297B92yt4GeyYe8hn
2020-10-19 19:22:08.658 11190-11190/com.score.scorev2 D/ARRAY AFTER SORT: [2020-10-19 23:18:58:435000-MK299AVpBCKcPx_NdR0, 2020-10-19 23:18:50:285000-MK297B92yt4GeyYe8hn]
2020-10-19 19:22:08.660 11190-11190/com.score.scorev2 D/SET UID item: 2020-10-19 23:18:58:435000-MK299AVpBCKcPx_NdR0
2020-10-19 19:22:08.660 11190-11190/com.score.scorev2 D/SET UID item: 2020-10-19 23:18:50:285000-MK297B92yt4GeyYe8hn
2020-10-19 19:22:08.660 11190-11190/com.score.scorev2 D/USER ARRAY: [5l5iy4Tg0zfp7DyqMtvBphEsmnh1, KQ78XVs7ezRRcduEU6gUHUrCj7i1]
2020-10-19 19:22:08.662 11190-11190/com.score.scorev2 D/SET UID item: 2020-10-19 23:18:58:435000-MK299AVpBCKcPx_NdR0
2020-10-19 19:22:08.663 11190-11190/com.score.scorev2 D/SET UID item: 2020-10-19 23:18:50:285000-MK297B92yt4GeyYe8hn
2020-10-19 19:22:08.663 11190-11190/com.score.scorev2 D/USER ARRAY: [5l5iy4Tg0zfp7DyqMtvBphEsmnh1, KQ78XVs7ezRRcduEU6gUHUrCj7i1]
2020-10-19 19:22:08.664 11190-11190/com.score.scorev2 D/SORTED USERS: [5l5iy4Tg0zfp7DyqMtvBphEsmnh1, KQ78XVs7ezRRcduEU6gUHUrCj7i1]
2020-10-19 19:22:08.664 11190-11190/com.score.scorev2 D/UID VAL: Jerry
2020-10-19 19:22:08.664 11190-11190/com.score.scorev2 D/UID VAL: Ethan

应用中显示的内容

【问题讨论】:

    标签: android kotlin firebase-realtime-database android-recyclerview


    【解决方案1】:

    您可以在适配器类中创建一个 updateData 函数,并在打印值的地方调用它。无需一次又一次地分配适配器。

    将您的适配器代码移到方法的第一行下方,如下所示 -

    val latestMsgId = FirebaseDatabase.getInstance().reference.child("Users")
    userAdapter = UserAdapter(p0, context!!, uidArray, true)
    recycler_view_chatlist.adapter = userAdapter    
    

    将以下方法添加到您的适配器类 -

      public fun updateData(list:ArrayList<Users>) {
        this.mUsers= list
        notifyDataSetChanged()
      }
    

    如下调用这个方法-

    val uidVal = p0.child(item).getValue(Users::class.java)
    uidArray.add(uidVal!!)
    Log.d("UID VAL", uidVal.getUserName().toString())
    executed = true
    userAdapter.updateData(uidArray)
    

    【讨论】:

    • 好的,所以我做了这些更改,但它仍然没有更新。但是,一旦我离开活动并返回它,它就会更新。
    • 对于即时更改,您需要集成不同的东西。首先,您需要检查每次从后端更改数据时是否调用了您的侦听器。
    • 我不认为它被调用了,我收到这条消息2020-10-22 14:17:59.106 14167-14167/com.score.scorev2 W/ClassMapper: No setter/field for (message id here) found on class com.score.scorev2.ModelClasses.Chat 的每一条消息。不确定这是否是我当前问题的一部分。你觉得我该怎么做?谢谢。
    • 是的,它需要刷新才能更新您的视图。否则您将无法看到更改,您需要返回屏幕才能看到更改。
    • 好的,我已经从几个地方查找了如何刷新数据。似乎 getUid 在刷新时没有被调用,这可能就是它没有更新的原因。你都有些什么想法呢?谢谢。我会添加更多我的片段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多