我正在尝试在回收站视图中显示片段。当您第一次加载片段并返回视图时,您会得到: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?
答案 0 :(得分:0)
在导入时初始化 com.ntx_deisgns.cyberchatter.cyberchatter.R。名字 mainActivityRecyclerView是我的recyclerview的ID
我认为它不起作用,因为您没有在RecyclerView
内初始化Fragment
,并且它显示一定不能为空错误。所以,我建议做这样的事情:
setupAdapter
方法中的代码
Fragment
在放大视图后 ,然后在return view
之前。onActivityCreated
并在其中移动setupAdapter
方法的代码,然后它应该可以工作。看一下: Android with Kotlin error when use RecyclerView in Fragment
P.s:记住,更新或设置后请使用
notifyDataSetChanged()
数据发送到adapter
以避免此类错误。