RecyclerView 在 Fragment 生命周期的什么时候准备好?
At what point in the Fragment lifecycle is a RecyclerView ready?
我这样填充 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
中用于某些 Button
时,它起作用了。该项目变得大胆。但是,我希望在将视图呈现给用户之前发生这种情况。但是当我把这段代码放在 onStart
、onResume
甚至 onViewCreated
中时,两者都
songs?.findViewHolderForAdapterPosition(0)
和
songs?.layoutManager?.findViewByPosition(0)
returnnull
。 总是。因此,在我看来,RecyclerView 尚未填充 files
中的项目。所以问题是,在 Fragment 生命周期中究竟是什么时候发生的?什么时候调用上述方法是安全的?
Now I want to make the currently playing song Bold:
第 1 步:让模型数据反映歌曲是否最新。换句话说,无论 files
是什么,都应该保存此数据。
第 2 步:让您的 onBindViewHolder()
在更新行的视图时考虑到这一点。对于每个 onBindViewHolder()
调用,根据模型数据将 TextView
更新为正常或粗体。
第 3 步:当当前播放的歌曲发生变化时,更新模型数据以反映变化,并在 RecyclerView.Adapter
上调用 notifyItemChanged()
以告知适配器这两个位置(以前-current 和 newly-current) 需要重新渲染。
Now I want to make the currently playing song Bold:
这不是一个好的解决方案。除了您目前看到的问题之外,它不适用于滚动:
行得到回收,所以现在当用户滚动您的列表时,一些随机的其他歌曲是粗体的
同一行不会重复用于同一位置,因此当您的用户向后滚动时,您当前播放的歌曲可能不再是粗体
So the question is, when exactly in the Fragment lifecycle does that happen?
片段生命周期与 RecyclerView
何时设置其视图之间没有关系。
我这样填充 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
中用于某些 Button
时,它起作用了。该项目变得大胆。但是,我希望在将视图呈现给用户之前发生这种情况。但是当我把这段代码放在 onStart
、onResume
甚至 onViewCreated
中时,两者都
songs?.findViewHolderForAdapterPosition(0)
和
songs?.layoutManager?.findViewByPosition(0)
returnnull
。 总是。因此,在我看来,RecyclerView 尚未填充 files
中的项目。所以问题是,在 Fragment 生命周期中究竟是什么时候发生的?什么时候调用上述方法是安全的?
Now I want to make the currently playing song Bold:
第 1 步:让模型数据反映歌曲是否最新。换句话说,无论 files
是什么,都应该保存此数据。
第 2 步:让您的 onBindViewHolder()
在更新行的视图时考虑到这一点。对于每个 onBindViewHolder()
调用,根据模型数据将 TextView
更新为正常或粗体。
第 3 步:当当前播放的歌曲发生变化时,更新模型数据以反映变化,并在 RecyclerView.Adapter
上调用 notifyItemChanged()
以告知适配器这两个位置(以前-current 和 newly-current) 需要重新渲染。
Now I want to make the currently playing song Bold:
这不是一个好的解决方案。除了您目前看到的问题之外,它不适用于滚动:
行得到回收,所以现在当用户滚动您的列表时,一些随机的其他歌曲是粗体的
同一行不会重复用于同一位置,因此当您的用户向后滚动时,您当前播放的歌曲可能不再是粗体
So the question is, when exactly in the Fragment lifecycle does that happen?
片段生命周期与 RecyclerView
何时设置其视图之间没有关系。