2016-09-27 24 views
6

Bir RecyclerView öğesinde öğelerim var ve her görünüm için onBindViewHolder'da onClickListener öğesini ayarlıyorum. Tıklama dinleyicisi iyi çalışıyor, sorun şu anda listedeki iki öğeyi tıklayabilirim ve her ikisi de onClick yöntemini çalıştıracak. Aynı anda iki maddeye tıklamaya çalışırsanız ListViews olduğunda size izin vermez.Aynı anda iki öğeye de tıklayabilirsiniz RecyclerView

Örneğin:
Listede bir öğeye zaten dokunduğunuzu ve bu süre zarfında başka bir öğeye dokunmayı denediğinizi söyleyelim. Recyclerview bunu sağlar.

RecyclerView öğesini tıklatırken bir ListView gibi çalışmasını nasıl sağlayabiliriz?

Aşağıda

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

İki öğede aynı anda tıklandığınızı nasıl anlıyorsunuz? –

+0

Geri izleme görünümünde, liste görünümünden farklı olarak – kgandroid

+0

@PramodYadav iyi tıklama, aynı dokunma ve dokunma anlamına gelir. Belki de açıklamamda farklı şekilde söylemeliydim. Temel olarak, bir liste görünümünde bir öğeye zaten dokunduğunuzu ve bu süre zarfında başka bir öğeye dokunmaya çalıştığınızı söyleyelim. Recyclerview bunu sağlar ve bu sorunun neden olduğunu düşünüyorum. – Kiki

cevap

6

Benim RecyclerView programlı Java eklemek değil xml edilir. Ve bu deneyin ve çalışır:

android:splitMotionEvents="false"; 

Ve şimdi listedeki tek öğenin üzerine tıkladığınızda: En RecyclerView xml eklemek edilir

mRecyclerView.setMotionEventSplittingEnabled(false); 

ederseniz, RecyclerView bu eklemeyi deneyebilirsiniz ve gitmesine izin vermeyin, başka bir öğeye tıklayamazsınız.

0

Maalesef RecyclerView sizin için idare olmaz benim uygulamasıdır. zaman aşımı ile Handler oluşturun:

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', 'android: splitMotionEvents =" false "' yi çağırarak bunu gayet iyi işler: – HBG

+0

Hayır, bu özellik, bir satırda hızlı tıklama (ve serbest bırakma) gibi birçok sorunu ortadan kaldırmaz, ardından hızlıca diğerine basın. Ayrıca, bir satırda iki etkileşimli öğeniz varsa, hemen hemen aynı anda iki şeyi basabilirsiniz, bu beklenmedik davranış olabilir. –

İlgili konular