【发布时间】:2020-09-02 16:48:03
【问题描述】:
我正在尝试从 firebase 实时数据库中获取数据,并将其存储在用户数据类列表中以在回收站视图中显示。但该列表不存储任何数据。我尝试在初始化期间添加一些虚拟数据,并且效果很好。但初始化后,它不存储任何东西。 我也尝试过使用可变列表,但这也不起作用。
我正在检索数据的主要片段:
class UserChatFragment : Fragment() {
lateinit var mobileno: String
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_user_chat, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val session = sessionManager(context!!)
mobileno = session.getLoginContact()
val UserList = getusersdata()
Chat_recyclerview.adapter = UsersAdapter(UserList)
Chat_recyclerview.layoutManager = LinearLayoutManager(context)
contact.text = mobileno
}
private fun getusersdata(): List<User> {
val list: = ArrayList<User>()
val databaseReference =
FirebaseDatabase.getInstance().reference.child("Users").child("Connections")
.child(mobileno)
databaseReference.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
for (data: DataSnapshot in snapshot.children) {
val userReference = FirebaseDatabase.getInstance().reference.child("Users")
.child("Accounts").child(data.key!!)
userReference.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
val item = User(
snapshot.child("name").value.toString(),
snapshot.child("profilePicture").value.toString(),
snapshot.child("phone").value.toString()
)
list.add(item)
}
}
override fun onCancelled(error: DatabaseError) {
Toast.makeText(context, error.message, Toast.LENGTH_SHORT).show()
}
})
}
}
}
override fun onCancelled(error: DatabaseError) {
Toast.makeText(context, error.message, Toast.LENGTH_SHORT).show()
}
})
return list
}
}
适配器类:
class UsersAdapter(private val userList: List<User>) :
RecyclerView.Adapter<UsersAdapter.UserViewHolder>() {
class UserViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val mName: TextView = itemView.cardname
val mImage: CircleImageView = itemView.cardprofilepicture
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
val itemView =
LayoutInflater.from(parent.context).inflate(R.layout.cardview_chat, parent, false)
return UserViewHolder(itemView)
}
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
val currentItem = userList[position]
// Glide.with(UsersAdapter).load()
Picasso.get().load(currentItem.profileimageurl).into(holder.mImage)
holder.mName.text = currentItem.name
}
override fun getItemCount()=userList.size
}
没有语法错误
【问题讨论】:
-
而不是ArrayList,尝试使用MutableList。所以它会像:
val list: MutableList<User> = mutableListOf() -
我试过了,但是效果一样
-
啊,我明白了,
onDataChange方法是异步工作的,所以不要修改局部变量,你应该修改类属性...。将列表移出到类属性中,然后执行在这些方法中更改它,并且不要忘记将数据更改通知适配器..
标签: android android-studio kotlin