5

tôi đã thực hiện onClick nghe để ViewHolder tôi cho RecyclerView tôivòi nhanh (nhấp chuột) trên RecyclerView mở nhiều mảnh vỡ

Nhưng khi tôi thực hiện vòi đôi rất nhanh hoặc cú click chuột, nó thực hiện các nhiệm vụ (mở ra một đoạn riêng biệt trong trường hợp này) hai hoặc ba lần.

đây là mã của tôi

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

Bất kỳ ý tưởng về làm thế nào để ngăn chặn hành vi như vậy?

Trả lời

9

Bạn có thể sửa đổi nó như thế này.

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_ ** Tiền ** tôi thích urs tốt hơn – ThunderRoid

+0

Vấn đề này đã đốt cháy đầu của tôi cho vài phút cuối cùng.Cảm ơn người đàn ông nó làm việc – Farwa

3

Đây là hành vi rất khó chịu. Tôi phải sử dụng một lá cờ phụ để ngăn chặn điều này trong công việc của tôi.

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

** nhờ **, ur khái niệm là đúng và nó hoạt động, nhưng phải có một số cách thích hợp để xử lý nó, tôi chỉ không biết nó được nêu ra, cảm ơn một lần nữa anyway. – ThunderRoid

+0

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

8

Cách tiếp cận đơn giản nhất ở đây sẽ sử dụng setMotionEventSplittingEnabled(false) trong RecyclerView.

Theo mặc định, giá trị này được đặt thành true trong RecyclerView, cho phép xử lý nhiều lần chạm.

Khi được đặt thành false, phương pháp ViewGroup này ngăn trẻ RecyclerView nhận được nhiều nhấp chuột, chỉ xử lý số lần nhấp đầu tiên.

Xem thêm về điều này here.

+0

giải pháp ngắn và ngọt ngào – Meet

+0

nhưng không làm việc cho tôi? –

0

Add bên dưới thuộc tính trong chủ đề của bạn

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

này sẽ ngăn chặn nhiều máy cùng lúc.

+0

Điều này không làm việc cho tôi: ( –

1
  • Tạo một boolean biến boolean canStart = true; trong Adaptor
  • Hãy OnClickListener như

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

  • Thêm phương pháp setCanStart trong lớp Adapter:

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

  • Cuối cùng vào những đoạn hay Hoạt động của (Trong trường hợp bộ chuyển đổi được gán cho recyclerview) thêm onResume này()

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

Hy vọng nó sẽ giúp :)

Các vấn đề liên quan