2016-10-10 1 views
2

Mein ViewHolder (inneren) Klasse:Einzel OnClickListener für mehrere 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); 
    } 
} 

In onBindViewHolder() i OnClickListener s auf die Button s folgt befestigen:

@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 
     } 
    }); 
} 

Es funktioniert gut, aber mein Problem Mit diesem Ansatz erstellt ich eine neue OnClickListener Instanz für jede ViewHolder, die irgendwie redundant fühlt.

Ich möchte eine einzelneOnClickListener Instanz erstellen zu verwenden, aber ich diese Art und Weise die position und holder params von onBindViewHolder() nicht zugreifen können.

Ist das möglich? Wenn das so ist, wie?

Vielen Dank im Voraus.

+0

Sie meinen Sie einen einzelnen Hörer für button1 und button2 wollen? –

Antwort

1

Sie können onClickListener in der ViewHolder-Klasse selbst anhängen.

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

Ja, es ist möglich, und Sie können es erreichen, wie @Gurupad vorgeschlagen, switch-Anweisung in onClick(View v) Verfahren. Und aus persönlicher Erfahrung ist es der beste Weg, mehr als einen onClicks zu behandeln, es macht Ihren Code für Sie und Ihr Team leicht lesbar und verständlich (wenn Sie mit einem Team arbeiten).

Für weitere Unterstützung mit switch-Anweisung mit Schaltflächen klicken

public void onClick(View v) { 
    switch (v.getId()){ 
    case R.id.button1: 
    //some code here 
    break; 
    case R.id.button2: 
    //some code here 
    break; 
    } 
} 
Verwandte Themen