Search code examples
android-recyclerviewfont-familytypeface

How to change the fonts of all items on recyclerview runtime


I wanted to change font family of items on a recycler view every time I click a button. So I coded like below.

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")
        }

But it changes only the font family of the first item of the recycler view. Is there a way to change fonts of them all together runtime? And please tell me why the code I wrote doesn't work right. Thank you.


Solution

  • If I were in your position, I would:

    1. Put your font changing calls inside of onBindViewHolder(). If you have to, you could put a bool in there like buttonClicked and link its value to your buttons.

    2. Come up with a good way to force a call to onBindViewHolder(). Sometimes notifyDataSetChanged() is enough. But in some cases, you might have to remove the adapter by setting it to null and then reset the adapter to its original value.

    3. Place that logic from step 2 inside of your buttons' onClick()s.

    Edit:

    What I mean is, create a var inside the class with the most exterior scope, so outside of oncreate().

    var textChoice=""
    
    

    Now use your buttons to change that var.

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

    Now inside your onBindViewHolder(), make the font switch.

    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
    

    Now when you want to show the change, call notifyDatasetChanged(). I think maybe the best place to do that would be inside of your buttons. So maybe you'd actually have:

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