Mena
Mena

Reputation: 3385

RecyclerView adding Item onclickListener() + timers optimization

I want to add an onClickListener to items in my RecyclerView. I added the listener in the Holder class as follows:

public class Holder extends RecyclerView.ViewHolder {

    TextView firstName;
    TextView lastName;

    public Holder (final View itemView) {
        super(itemView);
        firstName = itemView.findViewById(R.id.firstName );
        lastName= itemView.findViewById(R.id.lastName);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Do work
             }
        }
    }

But, I think this will cause the scrolling of the list to be a little jerky and not perfectly smooth specially on old devices.

Question 1: Is there a better way to do that? Or how can I optimize my code?

Question 2: I intend to add a dynamically changing variable for each item in the list such as a timer, and I don't want the scrolling to be too slow! How should I update the timers the best way?

Upvotes: 0

Views: 103

Answers (2)

Rohit Singh
Rohit Singh

Reputation: 18202

Jerky Scrolling

Since you are using RecyclerView I don't think that you will face any issue with scrolling because RecyclerView inherently comes with ViewHolder Pattern. (In case of Simple listView you have to make ViewHolder to avoid jerky scrolling)

Code improvement

Instead of adding a Listener in ViewHolder, make it a Class variable in your RecyclerView Adapter.

There is a standard way to add a Listener in RecyclerView

Create a listener

interface ClickListener{
   
       void click();

}

implement this listener to Your Activity

YourActivity implements ClickListener{

}

Typecast this listener in Your Adapter

YourAdapter extends RecyclerView.Adapter<YourAdapter.Holder>{

    ClickListener listener; 

    public YourAdapter(Context context)
    {
        this.context = context;
        
        listener = (ClickListener)context;
    }


    public class Holder extends RecyclerView.ViewHolder {

         TextView firstName;
         TextView lastName;

          public Holder (final View itemView) {
              super(itemView);
              firstName = itemView.findViewById(R.id.firstName );
              lastName= itemView.findViewById(R.id.lastName);
    
    }

    // Item Click listener goes here.

    @Override
    public void onBindViewHolder(DownLoadViewHolder holder, final int position) {
            // Do something
            listener.click(); 
    
      }

}

Just giving you the overview. You can see THIS for reference.

Upvotes: 1

aolphn
aolphn

Reputation: 2998

Create a member variable for item OnClickListener and set it in Holder's constructor.It will be one listener in your adapter when app is running.

Upvotes: 1

Related Questions