Meltix
Meltix

Reputation: 499

android - Change RecyclerView Item icon through Adapter

So, I'm creating an app, which has a RecyclerView in the settings. The RecyclerView items, contain a cardview, containing an ImageView, used to represent the item of the RecyclerView. What i need to do is replacing the placeholder ImageView with the newer icon, give trough the fragment that loads the RecyclerView. I created my RecyclerView in Kotlin following this tutorial.

Example of a single RecyclerView item

I tried creating a value with type ImageView, Image and Bitmap in the data class, however the functions suggested dont work.

How do you create an ImageView value in a class? How do you change a RecyclerView ImageView content?

dataListIcon.kt

import android.widget.ImageView

data class dataListIcons (
    val stringTitle: String,
    val stringDescription: String,
    val imageIcon: ImageView     //Here i tried creating the ImageView value
)

fragmentSettings.kt

class frgSettingsMain : Fragment() {
    val listsettings = listOf(
        dataListIcon("Option", "Description of option", R.drawable.ic_outline_color_lens_24),
        dataListIcon("Option", "Description of option", R.drawable.ic_outline_dashboard_24),
        dataListIcon("Option", "Description of option", R.drawable.ic_outline_image_24),
        dataListIcon("Option", "Description of option", R.drawable.ic_outline_volume_up_24),
        dataListIcon("Option", "Description of option", R.drawable.ic_outline_library_music_24)
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        retainInstance = true
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(R.layout.fragment_settingsmain, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        rvSettingsMain.apply {
            layoutManager = LinearLayoutManager(activity)
            adapter = adapterSettingsMain(listsettings)
        }
    }

    companion object {
        fun newInstance(): frgSettingsMain = frgSettingsMain()
    }
}

adapterSettings.kt

class adapterSettingsMain(
    var listsettings: List<dataItems>
) : RecyclerView.Adapter<adapterSettingsMain.SettingsViewHolder>() {

    inner class SettingsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SettingsViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_settingsicon, parent, false)
        return SettingsViewHolder(view)
    }

    override fun getItemCount(): Int {
        return listsettings.size
    }

    override fun onBindViewHolder(holder: SettingsViewHolder, position: Int) {
        holder.itemView.apply {
            rvSettingsTitle.text = listsettings[position].stringTitle
            rvSettingsDescription.text = listsettings[position].stringDescription
            rvSettingsIcon //TODO
        }
    }
}

Upvotes: 2

Views: 1793

Answers (2)

chand mohd
chand mohd

Reputation: 2550

val imageIcon: ImageView //Here i tried creating the ImageView value

Change ImageView type to int as R.drawable.ic_outline_color_lens_24 is Integer type

data class dataListIcons (
    val stringTitle: String,
    val stringDescription: String,
    val imageIcon Int    //Here i tried creating the ImageView value
)

Add this Inside your onBindViewHolder(...) method

 override fun onBindViewHolder(holder: SettingsViewHolder, position: Int) {
        holder.itemView.apply {
            rvSettingsTitle.text = listsettings[position].stringTitle
            rvSettingsDescription.text = listsettings[position].stringDescription
            rvIcon.setImageResource(listsettings[position].imageIcon);//rvIcon is id of ImageView from R.layout.item_settingsicon
        }
    }

Add <ImageView..../> inside your R.layout.item_settingsicon

Upvotes: 1

Ankit Gupta
Ankit Gupta

Reputation: 544

Solution 1:

Simply use Glide for image rendering in Imageviews.

It will be more flexible with more features use can use with it.

val imageView : ImageView = ..initialise it..
Glide.with(imageView).placeholder(R.drawable.your_placeholder).into(imageView)

Dependency:

implementation 'com.github.bumptech.glide:glide:4.11.0'

Solution 2:

val imageView : ImageView = ..initialise it..
imageView.setImageResource(R.drawable.your_resource)

Upvotes: 1

Related Questions