2016-10-10 3 views
2

Мой ViewHolder (внутренний) класс:Single OnClickListener для нескольких ViewHolders

static class HostViewHolder extends RecyclerView.ViewHolder { 

    ImageButton button1; 
    ImageButton button2; 

    HostViewHolder(View listItemView) { 
     super(listItemView); 

     button1 = (ImageButton) listItemView.findViewById(R.id.button1); 
     button2 = (ImageButton) listItemView.findViewById(R.id.button2); 
    } 
} 

В onBindViewHolder() я присоединять OnClickListener с до Button сек следующим образом:

@Override 
public void onBindViewHolder(final HostViewHolder holder, int position) { 
    holder.button1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int pos = holder.getAdapterPosition(); 
      // doing something using the value of pos 
     } 
    }); 
    holder.button2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int pos = holder.getAdapterPosition(); 
      // doing some other thing using the value of pos 
     } 
    }); 
} 

Это работает отлично, но моя проблема с этим подходом я создаю новый экземпляр OnClickListener для каждых ViewHolder, который чувствует себя излишним.

Я хотел бы создать одногоOnClickListener экземпляр для использования, но я не могу получить доступ к position и holder Params из onBindViewHolder() таким образом.

Можно ли достичь? Если да, то как?

Заранее спасибо.

+0

вы имеете в виду вы хотите одного слушателя для Button1 и button2? –

ответ

1

Вы можете прикрепить onClickListener в самом классе ViewHolder.

static class HostViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

    ImageButton button1; 
    ImageButton button2; 

    HostViewHolder(View listItemView) { 
     super(listItemView); 

     button1 = (ImageButton) listItemView.findViewById(R.id.button1); 
     button2 = (ImageButton) listItemView.findViewById(R.id.button2); 
     button1.setOnClickListener(this); 
     button2.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     int position = getAdapterPosition(); 
     switch (v.getId()){ 
      //handle clicks 
     } 
    } 
} 
0

Да его возможно, и вы можете достичь его, как это было предложено @Gurupad, используя переключатель заявление в onClick(View v) метода. И из личного опыта - лучший способ обработки более чем одного onClicks, он упрощает чтение и понимание кода для вас и вашей команды (при работе с командой).

Для получения дополнительной помощи с помощью переключателя оператор с кнопками мыши

public void onClick(View v) { 
    switch (v.getId()){ 
    case R.id.button1: 
    //some code here 
    break; 
    case R.id.button2: 
    //some code here 
    break; 
    } 
} 
Смежные вопросы