0

Создаю чат. Отображаю чаты в фрагменте:

private fun retrieveChatList()
    {
        mUsers = ArrayList()
    val ref = FirebaseDatabase.getInstance().reference.child("Users")
    ref!!.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(p0: DataSnapshot)
        {
            (mUsers as ArrayList).clear()

            for (dataSnapshot in p0.children)
            {
                val user = dataSnapshot.getValue(User::class.java)

                for (eachChatList in usersChatList!!)
                {
                    if (user!!.getUID().equals(eachChatList.getId()))
                    {
                        (mUsers as ArrayList).add(user!!)
                    }
                }
            }
            userAdapterSecond = UserAdapterSecond(context!!, (mUsers as ArrayList<User>), true)
            recycler_view_messages.adapter = userAdapterSecond
        }

        override fun onCancelled(p0: DatabaseError) {

        }
    })
}

Код работает успешно, чаты отображаются. Но при некоторых действиях (например, регистрация или авторизация) приложение вылетает. В Logcat посмотрел, где ошибка. Не работает эта часть кода:

userAdapterSecond = UserAdapterSecond(context!!, (mUsers as ArrayList<User>), true)

Полный код фрагмента:

class MessagesFragment : Fragment() {
private var userAdapterSecond: UserAdapterSecond? = null
private var mUsers: List&lt;User&gt;? = null
private var usersChatList: List&lt;ChatList&gt;? = null
lateinit var recycler_view_messages: RecyclerView
private var firebaseUser: FirebaseUser? = null

private var param1: String? = null
private var param2: String? = null

override fun onCreate(savedInstanceState: Bundle?)
{
    super.onCreate(savedInstanceState)
    arguments?.let {
        param1 = it.getString(ARG_PARAM1)
        param2 = it.getString(ARG_PARAM2)
    }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val view = inflater.inflate(R.layout.fragment_messages, container, false)


    recycler_view_messages = view.findViewById(R.id.recycler_view_messages)
    recycler_view_messages.setHasFixedSize(true)
    recycler_view_messages.layoutManager = LinearLayoutManager(context)


    firebaseUser = FirebaseAuth.getInstance().currentUser


    usersChatList = ArrayList()

    val ref = FirebaseDatabase.getInstance().reference.child(&quot;ChatList&quot;).child(firebaseUser!!.uid)
    ref!!.addValueEventListener(object : ValueEventListener{
        override fun onDataChange(p0: DataSnapshot)
        {
            (usersChatList as ArrayList).clear()

            for (dataSnapshot in p0.children)
            {
                val chatList = dataSnapshot.getValue(ChatList::class.java)

                (usersChatList as ArrayList).add(chatList!!)
            }
            retrieveChatList()
        }

        override fun onCancelled(p0: DatabaseError) {

        }
    })


    return view
}

companion object {
    fun newInstance(param1: String, param2: String) =
        MessagesFragment().apply {
            arguments = Bundle().apply {
                putString(ARG_PARAM1, param1)
                putString(ARG_PARAM2, param2)
            }
        }
}

private fun retrieveChatList()
{
    mUsers = ArrayList()

    val ref = FirebaseDatabase.getInstance().reference.child(&quot;Users&quot;)
    ref!!.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(p0: DataSnapshot)
        {
            (mUsers as ArrayList).clear()

            for (dataSnapshot in p0.children)
            {
                val user = dataSnapshot.getValue(User::class.java)

                for (eachChatList in usersChatList!!)
                {
                    if (user!!.getUID().equals(eachChatList.getId()))
                    {
                        (mUsers as ArrayList).add(user!!)
                    }
                }
            }
            userAdapterSecond = UserAdapterSecond(context!!, (mUsers as ArrayList&lt;User&gt;), true)
            recycler_view_messages.adapter = userAdapterSecond
        }

        override fun onCancelled(p0: DatabaseError) {

        }
    })

} }

В чём может быть проблема?

Лог ошибки:

2020-11-16 22:29:56.969 17231-17231/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.megapixel.trashbench, PID: 17231
    kotlin.KotlinNullPointerException
        at com.megapixel.trashbench.Fragments.MessagesFragment$retrieveChatList$1.onDataChange(MessagesFragment.kt:124)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
        at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
        at android.os.Handler.handleCallback(Handler.java:888)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:8178)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Alex
  • 41
  • Если нашёл в логах ГДЕ проблема, то что помешало там же рядом прочитать в чем именно? – Эникейщик Nov 16 '20 at 19:21
  • Если у вас ошибка - надо её лог к вопросу прикреплять. Без него можно долго гадать в чём проблема (причин может быть буквально тысячи и одно их перечисление займёт много-много часов). – ЮрийСПб Nov 16 '20 at 19:24
  • @ЮрийСПб добавил лог в правку – Alex Nov 16 '20 at 19:32
  • @Эникейщик добавил лог в правку – Alex Nov 16 '20 at 19:32
  • https://ru.stackoverflow.com/q/511085/282277 – Эникейщик Nov 16 '20 at 19:35
  • Скорее всего у вас context null. Возможно это происходит из-за того, что фрагмент на момент вызова падающей строки не прикреплён к активити. Выход - убирать слушатель изменений в БД когда фрагмент открепляется. Попробуйте удаление подписки делать в onDestroyView например. – ЮрийСПб Nov 16 '20 at 19:36

0 Answers0