android - 如何在使用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。解决办法是什么?有什么可以帮助我的吗?
解决方案
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> {
// (....)
}
}
推荐阅读
- c# - 使用 EF Core FromSql() 在 DbSet 上进行全文索引搜索
同一张表上的 ValueObject 应该没有 LEFT JOIN - android - 将csv文件导入SQLite并访问Android Studio
- c# - NServiceBus 序列化问题
- wordpress - 多个 Rest API 条目出现但帖子已被删除
- c++ - 如何使用二维数组构建如下坐标系?C++
- python - 是否可以重新训练谷歌的通用句子编码器,以便在编码句子时考虑关键字?
- reactjs - 如何使用 React 创建确认对话框组件
- mysql - 带有来自 Docker Hub 的自定义图像的多容器应用程序
- notifications - 来自 Azure DevOps 的实时通知
- logging - 使用 Logstash 解析 Kubernetes syslog 日志