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