Просмотр становится нулевым, когда внутри коллекции FireStore Android Kotlin

# #android #firebase #kotlin #google-cloud-firestore #nullpointerexception

Вопрос:

Я создаю многопользовательскую игру для Android и создаю многопользовательские игровые комнаты. Но есть странная ситуация, которую я не решил. Когда я нажимаю кнопку, чтобы сначала создать многопользовательскую комнату, ее можно создать, но когда я возвращаюсь к заднему фрагменту и хочу создать снова, мое приложение выходит из строя.

 class SeviyeBirFragment : Fragment() {

    lateinit var db : FirebaseFirestore
    lateinit var db2 : FirebaseFirestore
    lateinit var mAuth : FirebaseAuth
    
    val roomsList = arrayListOf<String>()
    
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment

        val view : View = inflater.inflate(R.layout.fragment_seviye_bir, container, false)
        
        return view
    }
    

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        
        db = FirebaseFirestore.getInstance()
        db2 = FirebaseFirestore.getInstance()
        mAuth = FirebaseAuth.getInstance()
        

   
            createGame.setOnClickListener {

                startingTheGame()

            }
        

    }
    

    private fun startingTheGame() {
        

        createRoomButton.setOnClickListener {


            createRoomButton.text = "Game is Creating..."
            createRoomButton.isEnabled = false

            playerName = mAuth.currentUser?.displayName.toString()

            roomName = playerName

            val hashMap = hashMapOf<Any,Any>()
            if (roomName != null) {
                hashMap.put("player1",roomName)
            }

            db.collection("Rooms").add(hashMap).addOnSuccessListener {

                Toast.makeText(context,"Successful!!",Toast.LENGTH_SHORT).show()
                roomListener()

            }

        }



        listView.setOnItemClickListener { adapterView, view, i, l ->
            

            roomName = roomsList.get(i)


            println("roomlist a: "   roomsList.get(i) )

            println("roomlist a: "   roomName )

            val hashMap2 = hashMapOf<Any,Any>()
            if (roomName != null) {
                hashMap2.put("player2",roomName)
            }


            db.collection("Rooms").add(hashMap2).addOnSuccessListener {

                Toast.makeText(context,"Successful",Toast.LENGTH_SHORT).show()
                roomListener()

            }

        }

        addRoomsEventListener()




    }

    private fun roomListener() {

        db.collection("Rooms").addSnapshotListener { value, error ->

            if (error != null) {

                createRoomButton.setText("Create Game")
                createRoomButton.isEnabled = true

                Toast.makeText(context,"İnternet Sıkıntısı!",Toast.LENGTH_SHORT).show()

            } else {

                createRoomButton.setText("Create Game")
                createRoomButton.isEnabled = true

                val intent = Intent(activity,Main2Activity::class.java)
                startActivity(intent)
                requireActivity().finish()

            }

        }
    }

    private fun addRoomsEventListener() {

        db2.collection("Rooms")

        db2.collection("Rooms").addSnapshotListener { value, error ->


            if (error == null) {

                if (value != null){

                    if (!value.isEmpty){

                        val documents = value.documents

                        for ( document in documents) {

                            val deger = document.getString("player1")
                            val deger2 = document.getString("player2")

                            if (deger != null) {
                                roomsList.add(deger)

                                if (deger2 != null) {
                                    roomsList.add(deger2)

                                }
                            }

                            val arrayAdapter : ArrayAdapter<String>? =
                                context?.let { ArrayAdapter(it,android.R.layout.simple_list_item_1,roomsList) }

                            println("roomlist: "   roomsList)
                            listView.adapter = arrayAdapter

                        }
                    }
                }
            }
        }




    }
    

}
 

В этом коде при нажатии кнопки createRoomButton моя комната была создана первой, но при возврате назад и повторном нажатии приложение вылетает. Я проверил кнопку из XML, это не проблема для findViewById.

Это приводит к этой ошибке:

java.lang.Исключение NullPointerException: Попытка вызвать виртуальный метод ‘void android.widget.Листвью.Адаптер(android.виджет.ListAdapter)’ по нулевой ссылке на объект.

это относится к ListView.Адаптер = адаптер

Как можно решить эту проблему?

Комментарии:

1. Пожалуйста, поделитесь кодом, в котором вы используете .setAdapter().

2. Я уже поделился, это в addRoomsEventListener()

Ответ №1:

Я решил эту проблему. Возможно, любой человек может столкнуться с этой ошибкой, поэтому я объясню решение. На самом деле, я никогда не замечал, что прослушивание firestore продолжается при переключении между фрагментами или действиями. Прежде всего, я инициализирую ссылки таким образом ;

 var reference: ListenerRegistration? = null
var reference2: ListenerRegistration? = null
 

После этого я выравниваю слушателей ;

 reference = db.collection("Rooms").addSnapshotListener {...} 
reference2 = db2.collection("Rooms").addSnapshotListener {...}
 

И, наконец, я удаляю эти ссылки, когда изменяю свой фрагмент или уничтожаю свою деятельность.

   override fun onDestroyView() {
    super.onDestroyView()

     reference?.remove()
     reference2?.remove()

}
 

Комментарии:

1. Этот ответ не имеет ничего общего с вашим реальным вопросом. Исключение NullPointerException , на которое ссылается listView.Adapter = adapter , четко указывает, что ваш listView объект равен нулю.