5

ho implementato onClick ascoltatore alla mia ViewHolder per il mio RecyclerViewrubinetti veloci (clic) su RecyclerView apre più Frammenti

Ma quando mi esibisco doppi rubinetti molto veloci o clic del mouse, si svolge il compito (si apre un frammento separato in questo caso) due o tre volte.

Ecco il mio codice

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    TextView tvTitle, tvDescription; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     itemView.setClickable(true); 
     itemView.setOnClickListener(this); 

     tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 
     tvDescription = (TextView) itemView.findViewById(R.id.tv_description); 
    } 

    @Override 
    public void onClick(View v) { 
     mListener.onClick(FRAGMENT_VIEW, getAdapterPosition()); // open FRAGMENT_VIEW 
    } 
} 

Tutte le idee su come prevenire tale comportamento?

risposta

9

È possibile modificarlo in questo modo.

public class ViewHolder extends RecyclerView.ViewHolder implements 
     View.OnClickListener { 
    TextView tvTitle, tvDescription; 
    private long mLastClickTime = System.currentTimeMillis(); 
    private static final long CLICK_TIME_INTERVAL = 300; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     itemView.setClickable(true); 
     itemView.setOnClickListener(this); 

     tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 
     tvDescription = (TextView) itemView 
       .findViewById(R.id.tv_description); 
    } 

    @Override 
    public void onClick(View v) { 
     long now = System.currentTimeMillis(); 
     if (now - mLastClickTime < CLICK_TIME_INTERVAL) { 
      return; 
     } 
     mLastClickTime = now; 
     mListener.onClick(FRAGMENT_VIEW, getAdapterPosition()); // open 
                   // FRAGMENT_VIEW 
    } 
} 
+0

_thanks_ ** Money ** mi piace urs meglio – ThunderRoid

+0

Questo numero mi bruciava la testa da un paio di minuti. Grazie amico ha funzionato! – Farwa

3

Questo è un comportamento molto fastidioso. Devo usare una bandiera extra per impedirlo nel mio lavoro.

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
TextView tvTitle, tvDescription; 
private boolean clicked; 

public ViewHolder(View itemView) { 
    super(itemView); 
    itemView.setClickable(true); 
    itemView.setOnClickListener(this); 

    tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 
    tvDescription = (TextView) itemView.findViewById(R.id.tv_description); 
} 

@Override 
public void onClick(View v) { 
    if(clicked){ 
     return; 
    } 
    clicked = true; 
    v.postDelay(new Runnable(){ 
      @Override 
      public void run(View v){ 
       clicked = false; 
      } 
    },500); 
    mListener.onClick(FRAGMENT_VIEW, getAdapterPosition()); // open FRAGMENT_VIEW 
} 
} 
+0

** ** grazie, il tuo concetto è giusto e funziona, ma ci deve essere un modo corretto di gestirlo, ma non lo so ancora, grazie ancora. – ThunderRoid

+0

use -> new Handler(). PostDelayed (new Runnable() {...} invece di v.postDelay (new Runnable() {...} – ThunderRoid

8

L'approccio più diretto qui sarebbe utilizzando setMotionEventSplittingEnabled(false) nel vostro RecyclerView.

Per impostazione predefinita, questo è impostato su true in RecyclerView, consentendo l'elaborazione di più tocchi.

Se impostato su false, questo metodo ViewGroup impedisce ai bambini RecyclerView di ricevere più clic, elaborando solo il primo.

Vedi di più su questo here.

+0

soluzione breve e dolce. – Meet

+0

ma non funziona per me? –

0

Aggiungi sotto attributi nel tema

<item name="android:splitMotionEvents">false</item> 
<item name="android:windowEnableSplitTouch">false</item> 

questo modo si eviterà di rubinetto multipla allo stesso tempo.

+0

Questo non funziona per me :( –

1
  • Creare una variabile booleana boolean canStart = true; in adattatore
  • Fai OnClickListener come

    ViewHolder.dataText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(canStart) { canStart = false; // do canStart false // Whatever you want to do and not have run twice due to double tap } } }

  • Aggiungi metodo setCanStart in classe Adapter:

    public void setCanStart(boolean can){ canStart = can; }

  • Alla fine del del frammento o Attività di (in cui l'adattatore viene assegnato al recyclerview) Aggiungere questo onResume()

    @Override public void onResume() { super.onResume(); mAdapter.setCanStart(true); }

auguriamo che contribuiscano :)

Problemi correlati