android - RecyclerView 在 Fragment 生命周期的哪个阶段准备就绪?
问题描述
我像这样填充 RecyclerView:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.player, container, false)
view.findViewById<RecyclerView>(R.id.songs).adapter = object: RecyclerView.Adapter<MyViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val item = LayoutInflater.from(parent.context).inflate(R.layout.item_song, parent, false)
return MyViewHolder(item)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
(holder.item as TextView).text = files[position].tag.title()
}
override fun getItemCount(): Int = files.size
}
return view
}
item_song.xml
只是一个TextView
。
现在我想让当前播放的歌曲加粗:
val songs = view?.findViewById<RecyclerView>(R.id.songs)
val song = songs?.findViewHolderForAdapterPosition(0)?.itemView as TextView
// or val song = songs?.layoutManager?.findViewByPosition(0) as TextView
song.setTypeface(song.typeface, Typeface.BOLD)
当我将此代码放入OnClickListener
for someButton
时,它可以工作。该项目变为粗体。但是,我希望在将视图呈现给用户之前发生这种情况。但是当我把这段代码放在onStart
, ,onResume
甚至onViewCreated
songs?.findViewHolderForAdapterPosition(0)
和
songs?.layoutManager?.findViewByPosition(0)
返回null
。总是。因此,在我看来,RecyclerView 尚未填充来自files
. 所以问题是,究竟在 Fragment 生命周期中什么时候会发生这种情况?在什么时候调用上述方法是安全的?
解决方案
现在我想让当前播放的歌曲加粗:
步骤#1:让模型数据反映歌曲是否是最新的。换句话说,无论files
是什么都应该保存这些数据。
步骤#2:onBindViewHolder()
在更新行的视图时考虑到这一点。对于每次onBindViewHolder()
调用,TextView
根据模型数据将 更新为正常或粗体。
步骤#3:当当前播放的歌曲发生变化时,更新模型数据以反映变化,并调用notifyItemChanged()
告诉RecyclerView.Adapter
适配器这两个位置(以前的当前位置和新当前位置)需要重新渲染。
现在我想让当前播放的歌曲加粗:
这不是一个好的解决方案。除了您当前看到的问题之外,它不适用于滚动:
行被回收,所以现在一些随机的其他歌曲是粗体的,因为用户滚动你的列表
同一行不会在同一位置重复使用,因此当您的用户向后滚动时,您当前播放的歌曲可能不再是粗体
所以问题是,究竟在 Fragment 生命周期中什么时候会发生这种情况?
RecyclerView
片段生命周期与何时设置其视图之间没有关系。
推荐阅读
- logging - 天蓝色功能:无法从仪表板添加诊断设置
- angular - Web OTP API Typescript Typings 问题 - TypeScript 中缺少类型
- javascript - 下拉菜单打开时更改导航栏颜色
- ansible - Ansible (2.9) playbooks 中使用了哪个 YAML 版本?
- r - 如何在传单 addPolylines 中绘制 MULTILINESTRING?
- spring-boot - Spring sleuth with SpringBoot(日志相关) - Traceid & SpanId 未显示
- java - 如何在java中用字符替换整数数组
- php - 如何从联系表单 7 中获取字段值并将其传递给重定向 url?
- python - pandas 更新值失败,只取总数的一部分
- python - Python:如何在字符串中搜索重复的字符串