Meltix
Meltix

Reputation: 489

android - RecyclerView and OnItemClick: No value passed for parameter 'listener'

What's the objective

Im currently working on an app which has a RecyclerView for the Settings menu. This menu serves to load other fragments. So i needed to implement an OnItemClick function: for this, i followed this video.

What's the probelm

Following the given tutorial, Android Studio flags val adapter = adapterSettings(settingsList), saying No value passed for parameter 'listener'. I suppose that im missing something, since without the code written in the tutorial, the RecyclerView works.

So, am i missing something? Are there any ways to fix this in an easy and clean way?

Code:

activitySettings.kt

class ndActSettings : AppCompatActivity(), adapterSettings.OnItemClickListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.ndactivity_settings)

        topToolbarBack.setNavigationOnClickListener {
            finish()
        }

        var settingsList = listOf(
            dataItemsSettings(getString(R.string.look), getString(R.string.lookdescription), R.drawable.ic_colored_color_lens),
            dataItemsSettings(getString(R.string.reproduction), getString(R.string.reproductiondescription), R.drawable.ic_colored_view_carousel),
            dataItemsSettings(getString(R.string.images), getString(R.string.imagesdscription), R.drawable.ic_colored_image),
            dataItemsSettings(getString(R.string.audio), getString(R.string.audiodescription), R.drawable.ic_colored_volume_up),
            dataItemsSettings(getString(R.string.about), getString(R.string.aboutdescription), R.drawable.ic_colored_info)
        )

        val adapter = adapterSettings(settingsList) //ERROR HERE!
        rvSettings.adapter = adapter
        rvSettings.layoutManager = LinearLayoutManager(this)

    }

    override fun OnItemClick(position: Int) {
        //TODO
    }
}

adapterSettings.kt

class adapterSettings(
    var settingsList: List<dataItemsSettings>,
    var listener: OnItemClickListener
) : RecyclerView.Adapter<adapterSettings.SettingsViewHolder>() {

    inner class SettingsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
        init {
            itemView.setOnClickListener(this)
        }

        override fun onClick(p0: View?) {
            val position : Int = adapterPosition
            if (position != RecyclerView.NO_POSITION) {
                listener.OnItemClick(position)
            }
        }
    }

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

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

    override fun onBindViewHolder(holder: SettingsViewHolder, position: Int) {
        holder.itemView.apply {
            rvTitle.text = settingsList[position].stringTitle
            rvDescription.text = settingsList[position].stringDescription
            rvIcon.setImageResource(settingsList[position].itemIcon)
        }
    }

    interface OnItemClickListener {
        fun OnItemClick(position: Int)
    }
}

Upvotes: 0

Views: 1996

Answers (1)

guipivoto
guipivoto

Reputation: 18677

The constructor of class adapterSettings is expecting two parameters

class adapterSettings(
    var settingsList: List<dataItemsSettings>,
    var listener: OnItemClickListener
)

However, you are instantiating the object with one parameter only:

val adapter = adapterSettings(settingsList)

So, you have to add a second parameter.. An object that implements OnItemClickListener. Since you activity already implements that interface, you can send the activity as second parameter:

val adapter = adapterSettings(settingsList, this)

Upvotes: 2

Related Questions