我这样填充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)
当我把这段代码放到Button
的OnClickListener
中时,它工作了。项目变成粗体。但是,我希望这在视图呈现给用户之前发生。但是当我把这段代码放到onStart
、onResume
甚至onViewCreated
中时,两者都
songs?.findViewHolderForAdapterPosition(0)
和
songs?.layoutManager?.findViewByPosition(0)
return null
. Always.因此,在我看来,RecyclerView还没有被files
中的项填充。因此,问题是,在Fragment生命周期中,什么时候会发生这种情况?在什么时候调用上述方法是安全的?
1条答案
按热度按时间4ktjp1zp1#
现在,我想将当前播放的歌曲设置为粗体:
第一步:让模型数据反映歌曲是否是当前的。换句话说,无论
files
是什么,都应该包含这些数据。第二步:让你的
onBindViewHolder()
在更新行的视图时考虑到这一点。对于每个onBindViewHolder()
调用,根据模型数据将TextView
更新为普通或粗体。第3步:当当前播放的歌曲发生变化时,更新模型数据以反映这些变化,并在
RecyclerView.Adapter
上调用notifyItemChanged()
,以告诉适配器需要重新渲染两个位置(以前的当前位置和新的当前位置)。现在,我想将当前播放的歌曲设置为粗体:
这不是一个好的解决方案。除了您目前看到的问题之外,它将不适用于滚动:
因此,问题是,在Fragment生命周期中,这种情况究竟发生在什么时候?
片段生命周期与
RecyclerView
何时建立其视图之间没有关系。