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



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

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()内部。如果你需要,你可以在那里放一个bool,比如buttonClicked,并将它的值链接到你的按钮。

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

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

  4. 编辑:

我的意思是,在类的最外部范围内创建一个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的字体族,使用自定义字体。https://stackoverflow.com/a/16648457/15096801这篇文章很有帮助。

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

现在,当变量selectedFont被改变并且adapter.notifyDatasetChanged()在活动上被调用时,replaceFont将被调用,如:

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

最新更新