如何更改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")
}
但它只改变了回收站视图第一项的字体系列。
有没有办法在运行时一起更改它们的字体?请告诉我为什么我写的代码不能正常工作。
谢谢。
如果我处在你的位置,我会:
将您的字体更改调用放在 onBindViewHolder()
中。如果必须的话,你可以在里面放一个布尔值,比如 buttonClicked
和 link 它对你的按钮的价值。
想出一个强制调用onBindViewHolder()
的好方法。有时 notifyDataSetChanged()
就足够了。但在某些情况下,您可能必须通过将适配器设置为空来删除适配器,然后将适配器重置为其原始值。
将第 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()
}
我想在每次单击按钮时更改回收站视图中项目的字体系列。 所以我编码如下。
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()
中。如果必须的话,你可以在里面放一个布尔值,比如buttonClicked
和 link 它对你的按钮的价值。想出一个强制调用
onBindViewHolder()
的好方法。有时notifyDataSetChanged()
就足够了。但在某些情况下,您可能必须通过将适配器设置为空来删除适配器,然后将适配器重置为其原始值。将第 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()
}