5

ich onClick Zuhörer meine ViewHolder für meine RecyclerViewSchnelle Taps (Klicks) auf RecyclerView öffnet mehrere Fragmente

Aber wenn ich sehr schnell Doppel Taps oder Mausklicks ausführen implementiert haben, führt es die Aufgabe (öffnet ein separates Fragment in in diesem Fall) zwei- oder dreimal.

hier ist mein Code

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 
    } 
} 

Alle Ideen, wie ein solches Verhalten zu verhindern?

Antwort

9

Sie können es so ändern.

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_ ** Geld ** ich mag urs besser – ThunderRoid

+0

Dieses Problem Ich verbrannte meinen Kopf für die letzten paar Minuten. Danke Mann, es funktionierte! – Farwa

3

Dies ist ein sehr ärgerliches Verhalten. Ich muss eine zusätzliche Flagge verwenden, um dies in meiner Arbeit zu verhindern.

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

** ** Dank helfen wird, Dein Konzept ist richtig und es funktioniert, aber es muss einen richtigen Weg geben, damit umzugehen, ich weiß es einfach noch nicht, danke nochmal. – ThunderRoid

+0

Verwendung -> neuer Handler(). PostDelayed (neues Runnable() {...} statt v.postDelay (neues Runnable() {...} – ThunderRoid

8

Der einfachste Ansatz wäre hier setMotionEventSplittingEnabled(false) in Ihrem RecyclerView werden.

Standardmäßig ist dies in RecyclerView auf "True" gesetzt, sodass mehrere Berührungen verarbeitet werden können.

Wenn diese Einstellung auf "false" gesetzt ist, verhindert diese ViewGroup-Methode, dass die RecyclerView untergeordneten Objekte mehrere Klicks erhalten und nur die erste verarbeitet wird.

Weitere Informationen hierzu finden Sie unter here.

+0

kurze und süße Lösung. – Meet

+0

aber funktioniert nicht für mich? –

0

Add-Attribute unten in Ihrem Thema

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

Dieser Mehrfachhahn zur gleichen Zeit verhindern.

+0

Dies funktioniert nicht für mich :( –

1
  • Erstellen Sie eine boolean Variable boolean canStart = true; in Adapter
  • Machen OnClickListener wie

    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 } } }

  • setCanStart Methode in Adapter-Klasse hinzufügen:

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

  • Endlich in dem Fragmente des oder Aktivität des (Wo der Adapter mit dem recyclerview zugeordnet ist) hinzufügen, um dieses onResume()

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

Hope it :)

Verwandte Themen