如何在片段加载时将适配器附加到片段中的recyclerview

时间:2018-08-26 19:55:21

标签: android android-fragments android-recyclerview kotlin

我正在尝试在回收站视图中显示片段。当您第一次加载片段并返回视图时,您会得到:E/RecyclerView: No adapter attached; skipping layout.,这是因为实际上我最初没有连接适配器。我在名为createFirebaseListener()的函数中调用适配器,该函数侦听数据库的更改并实时更新recyclerview。这是代码:

    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中的recyclerview?

1 个答案:

答案 0 :(得分:0)

  

在导入时初始化   com.ntx_deisgns.cyberchatter.cyberchatter.R。名字   mainActivityRecyclerView是我的recyclerview的ID

我认为它不起作用,因为您没有在RecyclerView内初始化Fragment,并且它显示一定不能为空错误。所以,我建议做这样的事情:

  1. 初始化和移动setupAdapter方法中的代码 Fragment 在放大视图后 ,然后在return view之前。
  2. 覆盖onActivityCreated并在其中移动setupAdapter方法的代码,然后它应该可以工作。

看一下: Android with Kotlin error when use RecyclerView in Fragment

  

P.s:记住,更新或设置后请使用notifyDataSetChanged()   数据发送到adapter以避免此类错误。