首页 > 解决方案 > 如何在使用cardview的片段中初始化gridlayoutmanager?

问题描述

我是使用 GridLayoutManager 的新手,需要一些帮助来初始化它。我用 cardview 创建了 recyclerview 的测试版本,当我的代码放在 mainactivity 中时它工作得很好。但是现在当我将它复制到主项目到我的 HomeFragment 时,显示 GridLayout 管理器初始化错误。

我在 HomeFragment 中的代码:

class HomeFragment : Fragment() {
private var recyclerView: RecyclerView? = null
private var charItem: ArrayList<CharItem>? = null
private var gridLayoutManager: GridLayoutManager? = null
private var alphaAdapters: AlphaAdapters? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    applicationContext
    recyclerView = findViewById(R.id.recycler_view_item)
    gridLayoutManager =
        GridLayoutManager(**applicationContext**, 2, LinearLayoutManager.VERTICAL, false)
    recyclerView?.layoutManager = gridLayoutManager
    recyclerView?.setHasFixedSize(true)
    charItem = ArrayList()
    charItem = setAlphas()
    alphaAdapters = AlphaAdapters(**applicationContext,** charItem!!)
    recyclerView?.adapter = alphaAdapters

}

private fun setAlphas(): ArrayList<CharItem> {

    var arrayList: ArrayList<CharItem> = ArrayList()

    arrayList.add(CharItem(R.drawable.image_3__2_, R.drawable.ic_nail,"Nail 
услуги")).....

}

问题出在应用程序上下文中

所以问题出在 HomeFragment 代码中,尤其是 GridLayoutManager 中的 ApplicationContext。解决办法是什么?有什么可以帮助我的吗?

标签: androidkotlinandroid-recyclerviewcardviewgridlayoutmanager

解决方案


Fragment 生命周期与 Activity 略有不同,最值得注意的是,您必须分解视图初始化,因为它具有单独的生命周期(与 Activity 不同,它可以分离并经历视图破坏,同时保持 Fragment 本身完好无损)。为此,您应该使用onViewCreated方法和实现onDestroyView来清除视图引用。

片段内部获取上下文的最佳实践是使用,然后如果需要,requireContext()您可以继续从中提取。applicationContext

片段也没有setContentView方法。您必须覆盖onCreateView方法,或者如果您使用的是静态布局,则可以使用Fragment (int contentLayoutId)构造函数:

class HomeFragment : Fragment(R.layout.activity_main) {
    private var alphaAdapters: AlphaAdapters? = null
    private var charItem: ArrayList<CharItem>? = null

    private var recyclerView: RecyclerView? = null
    private var gridLayoutManager: GridLayoutManager? = null

    // initialize adapter in onCreate, it's unaffected by views state
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        charItem = ArrayList()
        charItem = setAlphas()
        alphaAdapters = AlphaAdapters(requireContext(), charItem!!)
    }

    // initialize recyclerView and layout manager
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        gridLayoutManager = GridLayoutManager(requireContext(), 2, LinearLayoutManager.VERTICAL, false)
        recyclerView = view.findViewById(R.id.recycler_view_item).also {
            it.layoutManager = gridLayoutManager
            it.setHasFixedSize(true)
            it.adapter = alphaAdapters
        }
   }

    // release recyclerView and layout manager
   override fun onDestroyView() {
       super.onDestroyView()
       recyclerView?.adapter = null
       recyclerView = null
       gridLayoutManager = null
   }

   private fun setAlphas(): ArrayList<CharItem> {
       // (....)
   }
}

推荐阅读