如何在使用cardview的片段中初始化gridlayoutmanager?

Posted

技术标签:

【中文标题】如何在使用cardview的片段中初始化gridlayoutmanager?【英文标题】:How to initialize gridlayoutmanager in fragment which uses cardview? 【发布时间】:2020-11-01 17:34:15 【问题描述】:

我是使用 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。解决办法是什么?有什么可以帮助我的吗?

【问题讨论】:

【参考方案1】:

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> 
       // (....)
   

【讨论】:

我只是放在三角括号中 findViewById 并且效果很好!谢谢你非常匹配!

以上是关于如何在使用cardview的片段中初始化gridlayoutmanager?的主要内容,如果未能解决你的问题,请参考以下文章

从 RecyclerView 单击 CardView 加载片段

共享元素返回过渡不适用于片段中的 recyclerview 和 cardview

CardView 不在披萨片段中显示图片

CardView 在我的片段上不能完全滚动

我如何使用视图模型从另一个片段访问函数

如何将Intent用于回收者视图中的片段? [关闭]