suku
suku

Reputation: 10939

How to setup onclicklisteners in reused recyclerview adapters in the same activity?

I am making a fitness app where the user puts in the number of reps he/she did and the weight used. I am using a recyclerview to make clickable data entry. I can use the same adapter to display both reps and weight but how to differentiate whether the reps recyclerview item was selected or the weight recyclerview item was selected. Currently I am using separate adapters for both weight and reps with a difference of only the onclicklistener. Here are the reps and weight recyclerviews The reps and weight recyclerviews

Here is the code for the reps adapter. The weight adapter is the same except for the listener

public class RepsReelAdapter extends RecyclerView.Adapter<RepsReelAdapter.recyclerViewHolder> {

private LayoutInflater inflater;
private Context ctx;
List<NumReel> data = Collections.emptyList();
private RepsClickListener repsClickListener;

public RepsReelAdapter(Context context, List<NumReel> data){
    inflater = LayoutInflater.from(context);
    this.ctx = context;
    this.data = data;
}

@Override
public recyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.number_row, parent, false);
    return new recyclerViewHolder(view);
}

@Override
public void onBindViewHolder(recyclerViewHolder holder, int position) {
    NumReel current = data.get(position);
    holder.number.setText(String.valueOf(current.num));
}

@Override
public int getItemCount() {
    return data.size();
}

class recyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView number;

    public recyclerViewHolder(View itemView) {
        super(itemView);
        number = (TextView) itemView.findViewById(R.id.rnumber_tv);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(repsClickListener!=null){
            repsClickListener.repsClick(v, getAdapterPosition());
        }
    }
}

public interface RepsClickListener{
    void repsClick(View view, int position);
}

public void setRepsClickListener (RepsClickListener repsListener){
    this.repsClickListener = repsListener;
}

Here is the implementation of the click in the activity

    @Override
public void repsClick(View view, int position) {
    reps_num = repsReelAdapter.data.get(position).num;
}

Upvotes: 0

Views: 479

Answers (1)

Bhargav
Bhargav

Reputation: 8277

Instead of setting the onClickListener in the viewholder set in onBindViewHolder like so,

@Override
public void onBindViewHolder(recyclerViewHolder holder, int position) {
    NumReel current = data.get(position);
    holder.number.setText(String.valueOf(current.num));
    holder.mView.setTag(current);
    holder.mView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            NumReel dataAttachedToThisView = (NumReel) v.getTag();
            // look at dataAttachedToThisView and decide if its weight or rep, then invoke
            // respective methods
        }
    });
}

class recyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView number;
    View mView;

    public recyclerViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
        number = (TextView) itemView.findViewById(R.id.rnumber_tv);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(repsClickListener!=null){
            repsClickListener.repsClick(v, getAdapterPosition());
        }
    }
}

each adapter can hold a list of same data type, so you have to use the same class model that supplies the view with objects. What you can do is add an additional paramter called type or use inheritence

Upvotes: 1

Related Questions