后kotlin android片段空回收站视图

我有这个android片段:

class MainFragment: BaseFragment(){ private val recyclerView by lazy { find(R.id.recyclerView) } private val fab by lazy { find(R.id.fab) } private val myLayoutManager by lazy { LinearLayoutManager(ctx, LinearLayoutManager.VERTICAL, false) } private val myAdapter by lazy { MainCardAdapter(ctx, ArrayList(), R.layout.card_main_item) } override val fragmentLayout = R.layout.fragment_main_layout val DUMMY_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing" ) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = super.onCreateView(inflater, container, savedInstanceState) setHasOptionsMenu(true) return view } override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { Log.i("TAG", "onViewCreated") super.onViewCreated(view, savedInstanceState) (act as MainActivity).run { showWidgetStars(true) } recyclerView .linkToLayoutManager(myLayoutManager) .linkToAdapter(myAdapter) .addItemDecorator(removedSwipeLeftDecorator) .setOnItemChangedDuration(500) myAdapter.run { setAdapterItems(dummyList) } } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.activity_main_context, menu) menu.findItem(R.id.action_secundary_menu).run { isVisible = true icon.setTintCompat(ctx, act.colorFromRes(R.color.appGreyDark)) } super.onCreateOptionsMenu(menu, inflater) } override fun onOptionsItemSelected(item: MenuItem): Boolean { when(item.itemId){ R.id.action_secundary_menu -> { act.showSnackBar("Clicked Secondary Menu!") return true } else -> return super.onOptionsItemSelected(item) } } } 

除了我回到这个片段(在片段管理器中被另一个替换,添加到后台),一切都很好。 当我回来,我得到一个错误说: E/RecyclerView: No adapter attached; skipping layout E/RecyclerView: No adapter attached; skipping layout 。 我敢打赌,它与懒惰属性有关,但我不明白为什么。 该片段在第一次运行时显示良好,只有在返回时才显示没有回收器视图项目并显示该消息

所以当我的属性被声明为lazy { find(R.id.xxx} ,这基本上意味着它们只会从布局中被夸大一次。如果片段的视图需要重新创建,recyclerview属性将指向以旧观点。

我不知道这种情况下如何抛出空指针exception。 只需将lazy更改为var ,然后将其重新分配给onCreateView 。 另一件事,如果我们想要使用相同的LayoutManager为新的充气recyclerview,我们必须清除它从以前的recyclerview recyclerView.layoutManager = null ,否则,将抛出一个exception,说这个layoutManager器已经绑定到另一个recyclerView。