[英]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.