如何在使用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 加载片段