簡體   English   中英

Kotlin Fragment Recyclerview 未更新

[英]Kotlin Fragment Recyclerview not updating

每當發送新消息時,我希望回收者視圖更新。 日志以正確的順序顯示 uid,但視圖並未反映這一點。 我確實看到某處提到移動單個項目。 我試過了,但無法正常工作。 移動單個項目絕對是首選。 我移動了recycler_view_chatlist.adapter = userAdapter位,看看這是否可行,但無濟於事。 我也有userAdapter!!.notifyDataSetChanged()並且結果相同。 我嘗試在我的 UserAdapter 中創建一個函數並從我的片段中調用它。 我不知所措...

編輯* 我在片段中添加了一些代碼。

這是我的 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

應用程序中顯示的內容應用程序中顯示的內容

您可以在適配器類中創建一個 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM