Измените цвет ImageButton в RecyclerView с помощью интерфейса

Этот вопрос связан с моим предыдущим вопросом в здесь.

У меня есть RecyclerView, который показывает несколько (8) CardView. Внутри каждого CardView есть несколько элементов, таких как TextView, ImageButton и т. д. Я хочу изменить цвет вектора (.xml), назначенного ImageButton, с помощью OnClickListener той же кнопки.

Я использую интерфейс для связи между классом адаптера (RvAdapter расширяет RecyclerView.Adapter) и фрагментом.

public interface RvItemClickListener {
    void cardClick(View view, int position);
    void alarmClick(View view,int position);
}

В классе адаптера:

public class RvAdapter extends RecyclerView.Adapter<RvAdapter.ViewHolder> {
private List<Person> persons;
RvItemClickListener rvItemClickListener;
private Context mContext;

public RvAdapter(Context context,List<Person> persons) {
    this.mContext=context;
    this.persons=persons;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_content,parent,false);
    ViewHolder vh=new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    final ViewHolder mHolder=holder;
    mHolder.personName.setText(persons.get(position).name);
    mHolder.personAge.setText( persons.get(position).age);
}   

public void adapterSetClickListener(RvItemClickListener rvItemClickListener){
    this.rvItemClickListener=rvItemClickListener;
}

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    CardView cvCard;
    TextView personName;
    TextView personAge;
    ImageButton alarmImageButton;


    public ViewHolder(View itemView) {
        super(itemView);
        cvCard=(CardView)itemView.findViewById(R.id.cv_card);
        personName=(TextView)itemView.findViewById(R.id.txt_person_name);
        personAge=(TextView)itemView.findViewById(R.id.txt_person_age);
        alarmImageButton=(ImageButton)itemView.findViewById(R.id.alarm_image_button);

        cvCard.setOnClickListener(this);
        alarmImageButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.cv_card:
                if(rvItemClickListener!=null)
                    rvItemClickListener.cardClick(view,getAdapterPosition());
                break;
            case R.id.alarm_image_button:
                if(rvItemClickListener!=null)
                    rvItemClickListener.alarmClick(view, getAdapterPosition());
                break;
            default:
                break;
        }
    }
}
}

В моем классе фрагментов:

public class Main_fragment extends Fragment implements RvItemClickListener{
  private RvAdapter myRecyclerAdaper;
  ImageButton alarmImageButton;
  private HashMap<Integer, Boolean> clickedItems;

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
     myRecyclerAdaper.adapterSetClickListener(this);
     clickedItems=new HashMap<>();
  }

  @Override
public void cardClick(View view, int position) {
    //openinig a new fragment.....this works fine
    getDataToBundle(view,position);
    nextFragmentInstance.setTargetFragment(this,0);
    nextFragmentInstance.setArguments(detailsToPass);
    this.getFragmentManager()
            .beginTransaction()
            .replace(R.id.content_main,newFragmentInstance,"tag")
            .addToBackStack(null).commit();
}

 @Override
 public void alarmClick(View view, int position) {
    //toast to make sure wheather the click event identify the position... works fine 
    Toast.makeText(getContext(),String.valueOf(position),Toast.LENGTH_SHORT).show();

   //changing the color of ImageButton vector using an instance of it
    alarmImageButton=(ImageButton)view.findViewById(R.id.alarm_image_button);
    if(!clickedItems.containsKey(position)) {
        alarmImageButton.setColorFilter(Color.argb(255, 255, 255, 255));
        clickedItems.put(position, true);
    }else{
        alarmImageButton.setColorFilter(Color.argb(0,0,0,0));
        clickedItems.remove(position);
    }
  }
}

Я не привел полный код класса Fragment. Если кто-то хочет, я могу обновить код.

Однако вопрос похож на этот. Единственная разница в том, что на этот раз я использую интерфейс вместо onBindViewHolder() для событий щелчка. Когда я нажимаю на ImageButton, цвет его вектора меняется вместе с другим вектором ImageButton. Я попытался решить это, как в ссылке, которую я дал. Однако я потерпел неудачу.


person Nipuna Dilhara    schedule 07.07.2017    source источник
comment
Какова цель вызова в Fragment? Как я вижу, вы меняете только цвет кнопок, что вы можете просто сделать из Adapter.   -  person earthw0rmjim    schedule 07.07.2017
comment
@earthw0rmjim У меня есть основной фрагмент в моей деятельности. Моя цель - загрузить другой фрагмент при нажатии Cardview и установить сигнал тревоги при нажатии кнопки Image. Меняя цвета, я пытаюсь понять, как события кликов работают в Recyclerview. Да, я добился этого в Адаптере с вашей помощью. Здесь я просто попытался сделать то же самое, используя интерфейс. Просто для моих знаний.   -  person Nipuna Dilhara    schedule 09.07.2017
comment
@TofferJ Спасибо за редактирование.   -  person Nipuna Dilhara    schedule 09.07.2017