Android kotlin中的数组列表在初始化后未存储数据

Android kotlin中的数组列表在初始化后未存储数据,android,android-studio,kotlin,Android,Android Studio,Kotlin,我正在尝试从firebase实时数据库获取数据,并将其存储在用户数据类列表中,以在recycler视图中显示。但该列表没有存储任何数据。我试图在初始化过程中添加一些虚拟数据,这非常有效。但在初始化之后,它没有存储任何内容。 我也尝试过可变列表,但也不起作用 我检索数据的主要片段: class UserChatFragment : Fragment() { lateinit var mobileno: String override fun onCreateView(

我正在尝试从firebase实时数据库获取数据,并将其存储在用户数据类列表中,以在recycler视图中显示。但该列表没有存储任何数据。我试图在初始化过程中添加一些虚拟数据,这非常有效。但在初始化之后,它没有存储任何内容。 我也尝试过可变列表,但也不起作用

我检索数据的主要片段:

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 UserChatFragment:Fragment(){
lateinit var mobileno:字符串
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看{
返回充气机。充气(R.layout.fragment\u user\u chat,容器,false)
}
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
val会话=会话管理器(上下文!!)
mobileno=session.getLoginContact()
val UserList=getusersdata()
Chat_recyclerview.adapter=UsersAdapter(UserList)
Chat_recyclerview.layoutManager=LinearLayoutManager(上下文)
contact.text=mobileno
}
private fun getusersdata():列表{
val列表:=ArrayList()
val数据库参考=
FirebaseDatabase.getInstance().reference.child(“用户”).child(“连接”)
.儿童(mobileno)
databaseReference.addListenerForSingleValueEvent(对象:ValueEventListener{
覆盖数据更改(快照:DataSnapshot){
if(snapshot.exists()){
for(数据:snapshot.children中的DataSnapshot){
val userReference=FirebaseDatabase.getInstance().reference.child(“用户”)
.child(“Accounts”).child(data.key!!)
userReference.addListenerForSingleValueEvent(对象:ValueEventListener{
覆盖数据更改(快照:DataSnapshot){
if(snapshot.exists()){
val项目=用户(
snapshot.child(“name”).value.toString(),
snapshot.child(“profilePicture”).value.toString(),
snapshot.child(“phone”).value.toString()
)
列表。添加(项目)
}
}
覆盖已取消(错误:DatabaseError){
Toast.makeText(context,error.message,Toast.LENGTH\u SHORT.show())
}
})
}
}
}
覆盖已取消(错误:DatabaseError){
Toast.makeText(context,error.message,Toast.LENGTH\u SHORT.show())
}
})
返回列表
}
}
适配器类:


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
}

类UsersAdapter(private val userList:List):
RecyclerView.Adapter(){
类UserViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
val mName:TextView=itemView.cardname
val mImage:CircleImageView=itemView.cardprofilepicture
}
重写CreateViewHolder(父级:ViewGroup,viewType:Int):UserViewHolder{
val项目视图=
LayoutFlater.from(parent.context)。充气(R.layout.cardview\u chat,parent,false)
返回UserViewHolder(itemView)
}
覆盖onBindViewHolder(holder:UserViewHolder,位置:Int){
val currentItem=用户列表[位置]
//Glide.with(UsersAdapter.load())
Picasso.get().load(currentItem.profileimageurl).into(holder.mImage)
holder.mName.text=currentItem.name
}
重写getItemCount()=userList.size
}

没有语法错误

获取列表的方法
getUserList()
是异步的;这意味着它需要等待firebase产生结果

您可以看到这一点,因为您执行了
databaseReference.addListenerForSingleValueEvent…
操作,这意味着您添加的侦听器将在将来被调用,而不是同步调用

您的方法(
getUserList
)创建一个新列表,并返回它(空)

稍后,将调用firebase回调并修改本地列表;已经“太晚了”

作为一种“快速破解”,您可以将getUserList()方法更改为类似于
有趣的fetchResultsAndInitializeAdapter()
(这有点代码味道,因为函数正在做“两件事”,但它应该可以工作)。它不会返回任何东西

因此,在
fetchresultsandininitializedapter中,您可以在填充列表后初始化适配器:

                        override fun onDataChange(snapshot: DataSnapshot) {
                            val list: List<xxx>

                            if (snapshot.exists()) {
                                val item = User(
                                    snapshot.child("name").value.toString(),
                                    snapshot.child("profilePicture").value.toString(),
                                    snapshot.child("phone").value.toString()
                                )
                                list.add(item)
                            }

                            adapter = YourAdapter(list)
                            recyclerView.adapter = adapter
                        }
覆盖数据更改(快照:DataSnapshot){
val列表:列表
if(snapshot.exists()){
val项目=用户(
snapshot.child(“name”).value.toString(),
snapshot.child(“profilePicture”).value.toString(),
snapshot.child(“phone”).value.toString()
)
列表。添加(项目)
}
适配器=您的适配器(列表)
recyclerView.adapter=适配器
}
现在,我不会这么做。我相信这个数据库事务和列表突变不属于这里,它属于repo或viewmodel,它公开了片段/活动所观察到的LiveData,当发出一个值时,它只是传递给适配器

但整个firebase+列表创建+等不应与
class UserChatFragment : Fragment() {
    lateinit var mobileno: String
    val listUser: MutableList<User> = mutableListOf()  // move it out here..


...
... // TLDR
                            // somewhere on your code
                            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()
                                    )
                                    listUser.add(item)
                                    adapter.notifyDatasetChanges()
                                }
                            }
   ...
}