2016-09-27 20 views
6

Tôi có một danh sách các mục trong RecyclerView và tôi đặt onClickListener trong onBindViewHolder cho mỗi chế độ xem. Trình nghe nhấp chuột hoạt động tốt, vấn đề là tôi có thể nhấp vào hai mục trong danh sách cùng một lúc và cả hai đều sẽ chạy phương thức onClick của chúng. Khi bạn có ListViews nếu bạn cố gắng bấm vào hai mục cùng một lúc nó không cho phép bạn.Có thể nhấp vào hai mục cùng một lúc trong RecyclerView

Ví dụ:
Cho phép nói rằng bạn đã chạm vào một mục trong chế độ xem danh sách và trong thời gian đó, bạn cố gắng chạm vào một mục khác mà nó sẽ không cho phép bạn. Recyclerview cho phép điều đó.

Làm cách nào để chúng tôi có thể làm cho RecyclerView hoạt động như một ListView khi nhấp?

Dưới đây là thực hiện của tôi

public class DataCardAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private Context mContext; 
    private ArrayList<Data> mDatas = new ArrayList<>(); 
    private Data mData; 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View card = LayoutInflater.from(mContext).inflate(R.layout.card, parent, false); 
     return new DataCardViewHolder(mContext, card, mData); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     Data data = mDatas.get(position); 
     ((DataCardViewHolder)holder).configureDataCard(data); 
    } 

    public static class DataCardViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     private Context mContext; 
     private Data mData; 

     public DataCardViewHolder(Context context, View view, Data data) { 
      super(view); 
      mContext = context; 
      mData= data; 
     } 

     public void configureDataCard(final Data data) { 
      mData= data; 
      itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      Log.v("DataCardViewHolder","onClick with data: " + mData.getData().toString()); 
     } 
    } 
} 
+3

làm thế nào bạn tìm ra rằng bạn đang nhấp vào hai mục cùng một lúc? –

+0

Recyclerview không giống như listview có hành vi tương tự – kgandroid

+0

@PramodYadav cũng nhấp chuột có nghĩa là chạm và sau đó chạm vào. Có lẽ tôi nên nói nó khác trong mô tả của tôi. Về cơ bản, cho phép nói rằng bạn đã chạm vào một mục trong một listview và trong thời gian đó bạn cố gắng chạm vào một mục khác nó sẽ không cho phép bạn. Recyclerview cho phép điều đó và đây là những gì tôi nghĩ là gây ra vấn đề. – Kiki

Trả lời

6

RecyclerView của tôi được lập trình thêm bằng Java chứ không phải trong xml. Và tôi cố gắng này và nó hoạt động:

mRecyclerView.setMotionEventSplittingEnabled(false); 

Nếu RecyclerView của bạn được thêm vào trong xml, bạn có thể thử thêm này trong RecyclerView của bạn:

android:splitMotionEvents="false"; 

và bây giờ trong danh sách khi bạn bấm vào một mục và đừng bỏ qua, bạn không thể nhấp vào một mục khác.

0

Thật không may, RecyclerView sẽ không xử lý điều đó cho bạn. Tạo một Handler với thời gian chờ:

public class DelayedClick { 
    protected boolean canClick = true; 
    protected Handler myHandler = new Handler(); 

    private Runnable mMyRunnable = new Runnable() 
    { 
     @Override 
     public void run() { 
      canClick = true; 
     } 
    }; 

    public boolean getState() { 
     if(canClick) { 
      myHandler.postDelayed(mMyRunnable, 200); 
      canClick = false; 
      return true; 
     } 
     else return false; 
    } 
} 

@Override 
public void onClick(View v) { 
    if (!reClick.getState()) { 
     return; 
    } 
    //Code to execute on click 
} 
+0

'RecyclerView' xử lý việc này chỉ bằng cách gọi' android: splitMotionEvents = "false" ' – HBG

+0

Không, thuộc tính này không khắc phục được một số vấn đề như nhấp nhanh vào một hàng (và thả chíp), sau đó nhanh chóng nhấn một số khác. Ngoài ra, nếu bạn có hai yếu tố tương tác trong một hàng, thì bạn có thể nhấn hai thứ gần như cùng một lúc, có thể là hành vi không mong muốn. –

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