Dennis Vash
Dennis Vash

Reputation: 53884

How to set listener for RecyclerView adapter?

On my MainActivity there is a Button and RecyclerView with adapter for CheckedTextView.

I want to enable Button when there is a click on CheckedTextView.

I was able to achieve it with setting Button context to static but it isn't good (memory leak etc.)

I tried to get the Button from context and enabling it in simpleCheckedTextView.setOnClickListener:

class AndroidDeviceAdapter(internal var context: Context, private val devices: Array<String>) :
    RecyclerView.Adapter<AndroidDeviceAdapter.MyViewHolder>() {

    inner class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        ...
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        ...
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        ...

        holder.simpleCheckedTextView.setOnClickListener {

        // Getting exception
        (context as Activity).findViewById<Button>(order_button).isEnabled = true
        }
    }

What is the best way do active the Button? Is it possible to set listener for RecyclerView?

Upvotes: 0

Views: 1267

Answers (3)

B&#246; macht Blau
B&#246; macht Blau

Reputation: 13009

You can define an interface inside AndroidDeviceAdapter like so:

interface MyCheckedTextListener {
    fun onCheckedTextClicked()
}

Instead of a Context parameter, the adapter's Constructor should take a MyCheckedTextListener parameter:

class AndroidDeviceAdapter(internal var checkedTextListener: MyCheckedTextListener,
     private val devices: Array<String>) : RecyclerView.Adapter<MyListAdapter.MyViewHolder>()

The Activity has to pass in an instance of MyCheckedTextListener when instantiating the adapter.

The adapter will notify the Activity via this instance:

override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
    holder?.simpleCheckedTextView?.setOnClickListener {
        checkedTextListener.onCheckedTextClicked()
    }
}

So the Activity can set the new Button state (and the Button can stay private and non static)

Upvotes: 0

tapsey
tapsey

Reputation: 454

Please try the following.

(context as OrderActivity).order_button.isEnabled = true

Assuming order_button is a variable in your OrderActivity.

Upvotes: 0

Gratien Asimbahwe
Gratien Asimbahwe

Reputation: 1614

Yes it is possible. You can create a custom interface like this:

public interface RecyclerViewClickListener {
    void recyclerViewItemClicked(View view, int position);
}

and inside your adapter:

class AndroidDeviceAdapter(internal var context: Context, private val devices: Array<String>) :
    RecyclerView.Adapter<AndroidDeviceAdapter.MyViewHolder>() {

   ...
   private RecyclerViewClickListener recyclerViewClickListener;
   ...

   public void setRecyclerViewClickListener(RecyclerViewClickListener recyclerViewClickListener)
   {
   this.recyclerViewClickListener=recyclerViewClickListener;
   }
   ...

And then add item click listener:

 holder.simpleCheckedTextView.setOnClickListener {

        recyclerViewClickListener.recyclerViewItemClicked(holder.simpleCheckedTextView, getAdapterPosition());
        }

And then attach the listener in the activity where you want to perform a desired action.

Some of my snippets are in java style. somewhere combined with your kotlin code. Remember to sort please and adapt it to kotlin. Good coding

Upvotes: 1

Related Questions