我想在每次点击按钮时更改回收器视图中项目的字体系列。所以我编写如下代码:
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")
}
但是它只改变了回收器视图中第一项的字体族。有没有一种方法可以在运行时一起改变它们的字体?请告诉我为什么我写的代码不能正常工作。谢谢你。
如果我是你,我会:
-
将字体更改调用放在
onBindViewHolder()
内部。如果你需要,你可以在那里放一个bool,比如buttonClicked
,并将它的值链接到你的按钮。 -
想出一个好办法强制呼叫
onBindViewHolder()
。有时notifyDataSetChanged()
就足够了。但是在某些情况下,您可能必须通过将适配器设置为null来删除适配器,然后将适配器重置为其原始值。 -
将步骤2中的逻辑放在按钮的
onClick()
s中。 编辑:
我的意思是,在类的最外部范围内创建一个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()
}