Search code examples
androidandroid-recyclerviewandroid-adapter

How to handle same code on two button Click Event


I am using a Recyclerview to show some question and answer. On click on arrow button doing some stuff and on click on tvTitle doing same stuff.

Is there any way that I should not repeat the same code on two click listener. I can't use the method outside the onBindViewHolder because I am using viewholder item which can't handle outside onBindViewHolder.

Please help.

public void onBindViewHolder(@NonNull Adapter.ViewHolder viewHolder, int position) {

Model model = filteredList.get(position);

viewHolder.tvTitle.setText(model.getQuestion());
viewHolder.tvDescription.setText(model.getAnswer());

viewHolder.btnArrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Do some stuff
                if (viewHolder.tvDescription.getVisibility() == View.GONE) {
                    viewHolder.tvDescription.setVisibility(View.VISIBLE);
                    viewHolder.btnArrow.setBackgroundResource(R.drawable.ic_arrow_up1);
                } else {
                    viewHolder.tvDescription.setVisibility(View.GONE);
                    viewHolder.btnArrow.setBackgroundResource(R.drawable.ic_arrow_down1);
                }
            }
        });

viewHolder.tvTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Do some stuff
                if (viewHolder.tvDescription.getVisibility() == View.GONE) {
                    viewHolder.tvDescription.setVisibility(View.VISIBLE);
                    viewHolder.btnArrow.setBackgroundResource(R.drawable.ic_arrow_up1);
                } else {
                    viewHolder.tvDescription.setVisibility(View.GONE);
                    viewHolder.btnArrow.setBackgroundResource(R.drawable.ic_arrow_down1);
                }
            }
        });
    }

Solution

  • I achieved my desired answer by using a method and passing viewholder in it:

    viewHolder.btnArrow.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    doAction(viewHolder);
                }
            });
    
            viewHolder.tvTitle.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    doAction(viewHolder);
                }
            });
    
    

    Method:

    private void doAction(final ViewHolder viewHolder) {
    
            if (viewHolder.tvDescription.getVisibility() == View.GONE) {
                viewHolder.tvDescription.setVisibility(View.VISIBLE);
    
                viewHolder.btnArrow.setBackgroundResource(R.drawable.ic_arrow_up1);
            } else {
                viewHolder.tvDescription.setVisibility(View.GONE);
                viewHolder.btnArrow.setBackgroundResource(R.drawable.ic_arrow_down1);
            }
        }