【问题标题】:Fragment containing Recyclerview crashes when data is updated in firebase realtime database在 Firebase 实时数据库中更新数据时,包含 Recyclerview 的片段崩溃
【发布时间】: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


    【解决方案1】:
    @Override
    public void onStart() {
        super.onStart();
        requestAdapter.startListening();
    }
    
    @Override
    public void onStop() {
        super.onStop();
        requestAdapter.stopListening();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 2021-10-04
      • 1970-01-01
      • 2019-04-13
      相关资源
      最近更新 更多