【问题标题】:kotlin android fragment empty recycler view after back返回后的kotlin android片段空回收器视图
【发布时间】:2016-03-02 10:46:06
【问题描述】:

我有这个 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。我敢打赌,这与惰性属性有关,但我不知道为什么。该片段在第一次运行时显示良好,只有在返回时才显示没有回收器视图项目并显示此消息

【问题讨论】:

  • 返回fragment时能否检查onViewCreated()是否运行?
  • 是的,它确实调用了它。
  • 您可以尝试在 onResume 中设置您的adapterItems 吗?
  • idk 为什么,但看起来视图没有自动保存。我将 null 设置为 ondestroyview 中的适配器和布局管理器,它可以工作。
  • 知道了。视图的惰性启动将指向被破坏的旧布局。

标签: android android-recyclerview kotlin


【解决方案1】:

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

我不确定在这种情况下如何没有抛出空指针异常。只需将lazy 更改为var,然后在onCreateView 上重新分配它。还有一点,如果我们想对新膨胀的recyclerview使用相同的LayoutManager,我们必须从之前的recyclerviewrecyclerView.layoutManager = null中清除它,否则会抛出一个异常,说layoutManager已经绑定到另一个recyclerView .

【讨论】:

  • 没有 NullPointer,因为它们已被初始化。从堆栈返回后,它是相同的片段实例,仅重新创建视图。但是正如您所指出的,惰性属性并未重新启动。因为他们..你知道,懒惰,根据定义不应该。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2020-03-25
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多