Reputation: 53884
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
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
Reputation: 454
Please try the following.
(context as OrderActivity).order_button.isEnabled = true
Assuming order_button
is a variable in your OrderActivity
.
Upvotes: 0
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