首页 > 解决方案 > 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)

当我将此代码放入OnClickListenerfor someButton时,它​​可以工作。该项目变为粗体。但是,我希望在将视图呈现给用户之前发生这种情况。但是当我把这段代码放在onStart, ,onResume甚至onViewCreated

songs?.findViewHolderForAdapterPosition(0)

songs?.layoutManager?.findViewByPosition(0)

返回null总是。因此,在我看来,RecyclerView 尚未填充来自files. 所以问题是,究竟在 Fragment 生命周期中什么时候会发生这种情况?在什么时候调用上述方法是安全的?

标签: androidandroid-fragmentsandroid-recyclerviewfragment-lifecycle

解决方案


现在我想让当前播放的歌曲加粗:

步骤#1:让模型数据反映歌曲是否是最新的。换句话说,无论files是什么都应该保存这些数据。

步骤#2:onBindViewHolder()在更新行的视图时考虑到这一点。对于每次onBindViewHolder()调用,TextView根据模型数据将 更新为正常或粗体。

步骤#3:当当前播放的歌曲发生变化时,更新模型数据以反映变化,并调用notifyItemChanged()告诉RecyclerView.Adapter适配器这两个位置(以前的当前位置和新当前位置)需要重新渲染。

现在我想让当前播放的歌曲加粗:

这不是一个好的解决方案。除了您当前看到的问题之外,它不适用于滚动:

  • 行被回收,所以现在一些随机的其他歌曲是粗体的,因为用户滚动你的列表

  • 同一行不会在同一位置重复使用,因此当您的用户向后滚动时,您当前播放的歌曲可能不再是粗体

所以问题是,究竟在 Fragment 生命周期中什么时候会发生这种情况?

RecyclerView片段生命周期与何时设置其视图之间没有关系。


推荐阅读