I teach Kotlin, I want to implement an interface in the adapter for RecyclerView , through which I will return some value to the activation. Nicherta does not work, please suggest on some issues (at the end).

In Java, I would write it like this (interface: OnAnimalClickListener ):

Adapter:

 public class PackContentAdapter extends RecyclerView.Adapter<PackContentAdapter.ViewHolder> { private Context context; private OnAnimalClickListener onAnimalClickListener; ... void setOnAnimalClickListener(OnAnimalClickListener onAnimalClickListener) { this.onAnimalClickListener = onAnimalClickListener; } ... @Override public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { holder.bind(item); } ... class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { ... ViewHolder(View view) { super(view); ... } void bind(Item item) { ... } @Override public void onClick(View v) { onAnimalClickListener.onAnimalClicked(); } } public interface OnAnimalClickListener { void onAnimalClicked(); } } 

Activate:

 contentAdapter.setOnAnimalClickListener(() -> //doSomething); 

What I write on the cotlin (the names are slightly different):

Adapter:

 class PacksAdapter : RecyclerView.Adapter<PacksAdapter.ViewHolder>() { var onPackClickListener: OnPackClickListener? = null set(value) { field = value } var packList: ArrayList<Animal> = ArrayList() set(value) { field = value notifyDataSetChanged() } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.cell_animalpack_4, parent, false)) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.bind(packList[0], context) } class ViewHolder(view: View) : RecyclerView.ViewHolder(view),View.OnClickListener { ... fun bind(pack: AnimalPackFull, context: Context) { ... } override fun onClick(v: View?) { onPackClickListener. } } interface OnPackClickListener { fun onPackClicked(packId: Int) } } 

Activate:

 (recycler_packs.adapter as PacksAdapter).onPackClickListener = PacksAdapter.OnPackClickListener() 

Questions:

1) Here, the code is not without reason:

  override fun onClick(v: View?) { onPackClickListener. } 

The fact is that I do not see my onPackClickListener from the method, it is written that it is Unresolved . And why is that?

2) In activation, I get an error:

enter image description here

I just can not understand what they want from me?

    1 answer 1

    For an inner class to have access to an outer instance, it must be marked inner .

    And you are trying to instantiate an interface without implementing a method. This can be done like this:

     val listener = object: OnPackClickListener { override fun onPackClicked(packId: Int) { TODO("not implemented") } } 

    But this is not what you need, because in kotlin instead of functional interfaces java use functional types, in this case (Int) -> Unit

    Do not be lazy, take a couple of courses on kotlin at stepik.org , it will become clearer what's what.

    Introduction to Kotlin JVM

    Development of Android applications on Kotlin