2016-03-02 45 views
3

我有这样的机器人片段:科特林Android的片段空回收视图后回

class MainFragment: BaseFragment(){ 

private val recyclerView by lazy { find<RecyclerView>(R.id.recyclerView) } 
private val fab by lazy { find<FloatingActionButton>(R.id.fab) } 

private val myLayoutManager by lazy { LinearLayoutManager(ctx, LinearLayoutManager.VERTICAL, false) } 
private val myAdapter by lazy { MainCardAdapter(ctx, ArrayList<MainCardAdapterItem>(), 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。我的赌注是,它与懒惰属性有关,但我不明白为什么。该片段在第一次运行时显示良好,只有在返回后才显示没有回收站查看项目并显示此消息

+0

你可以检查当你回到片段时是否运行'onViewCreated()'? – AndroidEx

+0

是的,它叫它。 –

+0

你可以尝试在onResume中设置你的adapterItems吗? – CaseyB

回答

2

因此,我的属性被声明为lazy { find<View>(R.id.xxx},基本上意味着它们只会从布局中一次膨胀。如果需要再次创建片段的视图,recyclerview属性将指向旧视图。

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

+1

no NullPointer,因为它们已初始化。从堆栈返回后它是相同的片段实例,只有重新创建视图。但正如你所指出的,懒惰的属性并没有被重新引入。因为他们..你知道,懒惰和定义不应该。 – vigilancer