【发布时间】:2020-11-18 01:09:52
【问题描述】:
我在fragment 上有一个RecyclerView,它从firebase realtime database 读取数据,当我启动应用程序时一切正常,但是当我更新数据库中的数据时,应用程序立即崩溃
这是片段中的代码:
class RequestsFragment : Fragment() {
private lateinit var requestAdapter: RequestAdapter
lateinit var mUsers : List<UsersModel>
lateinit var mFriendsList : List<FriendsModel>
private lateinit var recyclerView: RecyclerView
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_requests, container, false)
recyclerView = view.findViewById(R.id.requestRecycler)
recyclerView.setHasFixedSize(true)
recyclerView.layoutManager = LinearLayoutManager(context)
mUsers = ArrayList()
mFriendsList = ArrayList()
val firebaseUser = FirebaseAuth.getInstance().currentUser!!
val ref = FirebaseDatabase.getInstance().reference.child("Friend_Requests")
.child("received_request").child(firebaseUser.uid)
ref.addValueEventListener(object : ValueEventListener {
override fun onDataChange(p0: DataSnapshot) {
(mFriendsList as ArrayList).clear()
for (dataSnapshot in p0.children){
val friendlist = dataSnapshot.getValue(FriendsModel::class.java)
(mFriendsList as ArrayList).add(friendlist!!)
}
retrieveRequests()
}
override fun onCancelled(p0: DatabaseError) {
}
})
return view
}
private fun retrieveRequests() {
val friendRef = FirebaseDatabase.getInstance().reference.child("Users")
friendRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(p0: DataSnapshot) {
(mUsers as ArrayList).clear()
for (snapshot in p0.children){
val user: UsersModel? = snapshot.getValue(UsersModel::class.java)
for (friend in mFriendsList) {
if (user!!.userId == friend.sender)
(mUsers as ArrayList).add(user)
}
}
requestAdapter = RequestAdapter(context!!,mUsers )
recyclerView.adapter = requestAdapter
requestAdapter.notifyDataSetChanged()
}
override fun onCancelled(p0: DatabaseError) {
}
})
}
}
这是适配器代码
class RequestAdapter (context: Context,
mUsers: List<UsersModel>)
:RecyclerView.Adapter<RequestAdapter.RequestHolder?>(){
private val mUsers: List<UsersModel>
private val context: Context
init {
this.mUsers = mUsers
this.context = context
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RequestHolder {
val view = LayoutInflater.from(context).inflate(R.layout.request_layout, parent, false)
return RequestHolder(view)
}
override fun getItemCount(): Int {
return mUsers.size
}
override fun onBindViewHolder(holder: RequestHolder, position: Int) {
val request = mUsers[position]
holder.name.text = request.name
if (request.profilePhoto != "default")
Picasso.get().load(request.profilePhoto).placeholder(R.drawable.avatar).into(holder.profilePic)
//holder.status.text = request.status
holder.acceptBtn.setOnClickListener {
Toast.makeText(context, "You Accepted ${request.name}'s friend request", Toast.LENGTH_SHORT)
.show()
}
holder.rejectBtn.setOnClickListener {
Toast.makeText(context, "You rejected ${request.name}'s friend request", Toast.LENGTH_SHORT)
.show()
}
holder.name.setOnClickListener{
val i = Intent(context, ProfileActivity::class.java)
i.putExtra("user_id", request.userId)
context.startActivity(i)
}
}
class RequestHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
var name: TextView
var status: TextView
var profilePic: CircleImageView
var acceptBtn : Button
var rejectBtn : Button
init {
name = itemView.findViewById(R.id.request_displayname)
status = itemView.findViewById(R.id.request_status)
profilePic = itemView.findViewById(R.id.requestImage)
acceptBtn = itemView.findViewById(R.id.acceptBtn)
rejectBtn = itemView.findViewById(R.id.rejectBtn)
}
}
}
我还有一个包含 RecyclerView 上的数据的活动,但在添加、删除或更新数据时不会崩溃。
日志显示错误在第 89 行,我在那里初始化了我的适配器
requestAdapter = RequestAdapter(context!!,mUsers )
但应用程序在数据更新之前运行良好。即使不是onStart,此片段也会使应用程序崩溃。
请有人帮帮我
【问题讨论】:
标签: android android-studio kotlin android-fragments android-recyclerview