【问题标题】:How do I attach an adapter to recyclerview in a fragment on fragment load如何在片段加载时将适配器附加到片段中的 recyclerview
【发布时间】:2018-08-26 19:55:20
【问题描述】:

我正在尝试在回收站视图中显示一个片段。当你第一次加载片段并返回你得到的视图时: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?

【问题讨论】:

  • 重点是,你在哪里初始化了 mainActivityRecyclerView ?我在你的代码中看不到它..
  • 在import com.ntx_deisgns.cyberchatter.cyberchatter.R中初始化。 mainActivityRecyclerView这个名字是我recyclerview的id。

标签: android android-fragments android-recyclerview kotlin


【解决方案1】:

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

我认为它不起作用,因为您没有在 Fragment 中初始化 RecyclerView 并且它显示 must not be null 错误。所以,我建议做这样的事情:

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

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

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

【讨论】:

  • 将setupAdapter 移动到onActivityCreated 消除了E/RecyclerView: No adapter attached; skipping layout. 错误,但如果手机旋转到横向,我会得到mainActivityRecyclerView must not be null。
  • 我需要将数组从createFirebaseListener 获取到'onActivityCreated'。我不能只声明一个空数组,因为这会使它为空。
  • 关于如何将数组放入onActivityLoad 或onActivityCreated 的任何想法?
  • 我建议先使用我的答案(第一个选项)。此外,您不必为自己太难,您可以在onCreateView 中使用这些代码。关于声明,我认为您将能够在onCreateView 的上方声明一个私有数组,然后您可以在当前的Fragment - Activity 中访问它,这是另一个问题,与此问题无关-线。更多问题请使用提问。
  • 将setupAdapter 移动到onCreateView 不会在进入片段时将数组加载到recyclerView,尽管setupAdapter 中没有数据。该数据是从onDataChanged 方法读取的,并且该方法永远不会从setupAdapter 访问。我需要从onDataChanged 获取数据到onCreate。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多