【问题标题】:At what point in the Fragment lifecycle is a RecyclerView ready?RecyclerView 在 Fragment 生命周期的哪个阶段准备就绪?
【发布时间】:2021-03-25 16:53:36
【问题描述】:

我这样填充 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 时,它可以工作。该项目变为粗体。但是,我希望在将视图呈现给用户之前发生这种情况。但是当我把这段代码放在onStartonResume,甚至onViewCreated,两者都

songs?.findViewHolderForAdapterPosition(0)

songs?.layoutManager?.findViewByPosition(0)

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

【问题讨论】:

    标签: android android-fragments android-recyclerview fragment-lifecycle


    【解决方案1】:

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

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 2017-10-06
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多