android-fragments 在Fragment生命周期的哪个阶段,RecyclerView已就绪?

2o7dmzc5  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(148)

我这样填充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)

当我把这段代码放到ButtonOnClickListener中时,它工作了。项目变成粗体。但是,我希望这在视图呈现给用户之前发生。但是当我把这段代码放到onStartonResume甚至onViewCreated中时,两者都

songs?.findViewHolderForAdapterPosition(0)

songs?.layoutManager?.findViewByPosition(0)

return null . Always.因此,在我看来,RecyclerView还没有被files中的项填充。因此,问题是,在Fragment生命周期中,什么时候会发生这种情况?在什么时候调用上述方法是安全的?

4ktjp1zp

4ktjp1zp1#

现在,我想将当前播放的歌曲设置为粗体:
第一步:让模型数据反映歌曲是否是当前的。换句话说,无论files是什么,都应该包含这些数据。
第二步:让你的onBindViewHolder()在更新行的视图时考虑到这一点。对于每个onBindViewHolder()调用,根据模型数据将TextView更新为普通或粗体。
第3步:当当前播放的歌曲发生变化时,更新模型数据以反映这些变化,并在RecyclerView.Adapter上调用notifyItemChanged(),以告诉适配器需要重新渲染两个位置(以前的当前位置和新的当前位置)。
现在,我想将当前播放的歌曲设置为粗体:
这不是一个好的解决方案。除了您目前看到的问题之外,它将不适用于滚动:

  • 行被循环使用,所以现在当用户滚动列表时,一些随机的其他歌曲是粗体的
  • 同一行不会在同一位置重复使用,因此当用户向后滚动时,当前播放的歌曲可能不再是粗体

因此,问题是,在Fragment生命周期中,这种情况究竟发生在什么时候?
片段生命周期与RecyclerView何时建立其视图之间没有关系。

相关问题