2015-10-14 12 views
8

Ho implementato Recyclerview onclickListener da questa soluzione Stack overflow. Questa soluzione funziona bene per i clic sugli articoli riciclati. Ma non riesco a ottenere quale sottoview (es: ImageView, Button) viene cliccato dalla riga.Recyclerview addOnItemTouchListener get whichsubview viene cliccato all'interno della riga

 mAttachmentRecyclerview.addOnItemTouchListener(
      new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() { 
       @Override 
       public void onItemClick(View view, int position) { 
        if (view.getId()==R.id.attachmnet_remove) { 
         attachmentsList.remove(position); 
         mAttachmentAdapter.notifyDataSetChanged(); 
         attachmentCount--; 
        } 
       } 
      } 
    )); 

onItemClick(view,position) restituisce sempre vista id come -1

Come faccio a monitorare whick View è cliccato ??

risposta

5

Tale risposta è superata in quanto utilizza RecyclerView.getChildPosition(View) che è deprecato. Prova a sostituirlo con RecyclerView.getChildAdapterPosition(View).

Se fossi in te, vorrei solo creare listener per ogni ViewHolder e le sue viste figlio che si desidera ascoltare. Onestamente, non mi sembra di vedere il vantaggio di usare quel metodo più complicato a cui hai fatto riferimento. Inoltre, quel metodo ti dirà solo che è stato fatto clic su un elemento, nulla sulle viste secondarie dell'oggetto.

Inoltre, in base allo docs, RecyclerView.OnItemTouchListener è pensato per essere utilizzato quando si desidera rilevare un tocco su un elemento mentre l'elenco scorre, non per i tocchi regolari o diretti.

+0

Totalmente d'accordo con il tuo commento per creare ascoltatori f o ogni ViewHolder – Simon

7

Di seguito è un ViewHolder che contiene due visualizzazioni di testo. title e description:

public class CustomViewHolder extends RecyclerView.ViewHolder { 
    private final OnViewClickListener mListener; 
    public final TextView title; 
    public final TextView description; 

    public interface OnViewClickListener { 
     void onViewClick(View v, int adapterPosition); 
    } 

    public CustomViewHolder(View itemView, OnViewClickListener mListener) { 
     super(itemView); 
     this.mListener = mListener; 
     title = (TextView) itemView.findViewById(R.id.titleTextView); 
     description = (TextView) itemView.findViewById(R.id.descriptionTextView); 

     title.setOnClickListener(onClickListener); 
     description.setOnClickListener(onClickListener); 

    } 

    private final View.OnClickListener onClickListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      mListener.onViewClick(view, getAdapterPosition()); 
     } 
    }; 
} 

Entrambi questi subviews hanno un OnClickListener ad essi connessi che chiama l'implementazione personalizzata OnViewClickListener passando il View che è stato cliccato così come la posizione dell'elementoRecyclerViewl'adattatore che ricevuto l'evento click.

Infine utilizzare View.getId() per recuperare l'ID della vista selezionata nell'implementazione OnViewClickListener.

0

Prova ad aggiungere onClickListeners alle sotto-visualizzazioni.

1

Set Tag

È possibile impostare tag viste mentre li inizializzazione tramite:

view1.setTag(1); 

Questo imposterà la visualizzazione Tag a 1.

poi nel metodo onItemClick:

@Override 
public void onItemClick(View view, int position) { 
if(view.getTag()==1) 
{ 
//do something 
} 
else 
{ 
//do something else 
}