Как мне прикрепить адаптер к утилите просмотра в фрагменте при загрузке фрагмента - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь отобразить фрагмент в представлении переработчика.Когда вы впервые загружаете фрагмент и возвращаете представление, вы получаете: E/RecyclerView: No adapter attached; skipping layout. Это потому, что на самом деле у меня нет подключенного адаптера вначале.Я вызываю адаптер в функции под названием createFirebaseListener(), которая прослушивает изменения в базе данных и обновляет обзор реселлера в режиме реального времени.Вот код:

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
            val view =  inflater.inflate(R.layout.groups, container, false)

            createFirebaseListener()

            setupSendButton(view)

            return view
        }

private fun createFirebaseListener(){
        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                val toReturn: ArrayList<Message> = ArrayList();

                for(data in dataSnapshot.children){
                    val messageData = data.getValue<Message>(Message::class.java)

                    //unwrap
                    val message = messageData?.let { it } ?: continue

                    toReturn.add(message)
                }

                //sort so newest at bottom
                toReturn.sortBy { message ->
                    message.timestamp
                }

                setupAdapter(toReturn)
            }

            override fun onCancelled(databaseError: DatabaseError) {
                //log error
            }
        }

        mDatabase?.child("Group Chat")?.addValueEventListener(postListener)
    }

 private fun setupAdapter(data: ArrayList<Message>){
        val linearLayoutManager = LinearLayoutManager(context)
        mainActivityRecyclerView.layoutManager = linearLayoutManager
        mainActivityRecyclerView.adapter = MessageAdapter(data){
            Log.d("we.", "got here!")
        }

        //scroll to bottom
        mainActivityRecyclerView.scrollToPosition(data.size - 1)
    }

Как вы можете видеть, в setupAdapter я обновляю представление рециркулятора каждый раз, когда приходит новое сообщение.Поскольку я не получаю сообщения при загрузке фрагмента, я получаю сообщение об ошибке выше при загрузке фрагмента.Но это также приводит к сбою приложения, если я изменю ориентацию на альбомную или если я загружаю другой фрагмент, а затем возвращаюсь к этому фрагменту: java.lang.IllegalStateException: mainActivityRecyclerView must not be null.

Как мне лучше всего справиться с заполнением окна повторного просмотра в onCreateView?

1 Ответ

0 голосов
/ 26 августа 2018

Инициализируется в импорте com.ntx_deisgns.cyberchatter.cyberchatter.R.Имя mainActivityRecyclerView является идентификатором моего повторного просмотра

Я считаю, что это не работает, потому что вы не инициализируете RecyclerView внутри Fragment и оно показывает, что не должно быть нулевой ошибкой .Итак, я бы предложил сделать что-то вроде этого:

  1. Инициализация и перемещение setupAdapter кодов методов внутри Fragment после надувания представления и доreturn view.
  2. Переопределить onActivityCreated и переместить в него коды метода setupAdapter, и тогда он должен работать.

Взглянуть: Android с ошибкой Kotlin при использовании RecyclerView во фрагменте

Ps: Помните, используйте notifyDataSetChanged() после обновления или установки данных на adapter, чтобы избежать таких ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...