如何更改recyclerview运行时所有项目的字体

How to change the fonts of all items on recyclerview runtime

我想在每次单击按钮时更改回收站视图中项目的字体系列。 所以我编码如下。

rbAritaBuri = view.findViewById(R.id.rb_aritaBuri)
rbCafe24 = view.findViewById(R.id.rb_cafe24SurroundAir)

rbAritaBuri.setOnClickListener {
            rv_work_preview.tv_work_content.typeface = Typeface.createFromAsset(requireActivity().assets, "fonts/arita_buri.otf")
        }

rbCafe24.setOnClickListener {
            rv_work_preview.tv_work_content.typeface = Typeface.createFromAsset(requireActivity().assets, "fonts/cafe24_surround_air.ttf")
        }

但它只改变了回收站视图第一项的字体系列。 有没有办法在运行时一起更改它们的字体?请告诉我为什么我写的代码不能正常工作。 谢谢。

如果我处在你的位置,我会:

  1. 将您的字体更改调用放在 onBindViewHolder() 中。如果必须的话,你可以在里面放一个布尔值,比如 buttonClicked 和 link 它对你的按钮的价值。

  2. 想出一个强制调用onBindViewHolder()的好方法。有时 notifyDataSetChanged() 就足够了。但在某些情况下,您可能必须通过将适配器设置为空来删除适配器,然后将适配器重置为其原始值。

  3. 将第 2 步中的逻辑放在按钮的 onClick()s 中。

编辑:

我的意思是,在具有最外部范围的 class 中创建一个 var,因此在 oncreate() 之外。

var textChoice=""

现在使用您的按钮更改该变量。

rbAritaBuri.setOnClickListener {
 textChoice="fonts/arita_buri.otf"
        }

现在在你的 onBindViewHolder() 中,进行字体切换。

when (fontChoice){
   "fonts/arita_buri.otf"->{ rv_work_preview.tv_work_content.typeface = Typeface.createFromAsset(requireActivity().assets, "fonts/arita_buri.otf")}
//and so on and so forth for all of your fonts

现在,当您想要显示更改时,请调用 notifyDatasetChanged()。我想也许最好的地方就是在你的按钮里面。所以也许你实际上有:

rbAritaBuri.setOnClickListener {
 textChoice="fonts/arita_buri.otf"
 <The name of your recyclerview adapter>.notifyDatasetChanged()
        }

我是这样解决的,感谢 D.Kupra:

class SampleWorkAdapter(private val context: Context) :
    RecyclerView.Adapter<SampleWorkAdapter.ViewHolder>() {
var selectedFont = EditTextActivity.HAMBAK_SNOW

首先,我将默认字体Hambak_snow分配给selectedFont,类型为String。

inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {

...

        fun changeFont(font: String) {
            CustomFontHelper.setCustomFont(content, font, itemView.context)
        } ...
    }

然后我编写了一个在 onBindViewHolder 上调用的函数,以使用自定义字体更改 textview 的字体系列。 这 post 帮助很大。

override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
...
        viewHolder.changeFont(selectedFont)
...
    }

现在,当变量 selectedFont 发生变化并且 adapter.notifyDatasetChanged() 在 activity 上被调用时,将调用 replaceFont,如下所示:

rbMapoFlowerIsland.setOnClickListener {
            sampleWorkAdapter.selectedFont = EditTextActivity.MAPO_FLOWER
            sampleWorkAdapter.notifyDataSetChanged()
        }