2016-09-27 20 views
6

RecyclerViewにアイテムのリストがあり、各ビューのonBindViewHolderにonClickListenerを設定しました。クリックリスナーはうまく動作します。問題は、リスト内の2つのアイテムを同時にクリックすることができ、両方ともonClickメソッドを実行することです。あなたが同時に2つのアイテムをクリックしようとするとListViewがあると、それはあなたを許可しません。RecyclerViewで同時に2つのアイテムをクリックすることができます

例:
あなたは既にリストビュー内のアイテムに触れており、その間に別のアイテムに触れようとすると、それはあなたに許されません。 Recyclerviewはそれを可能にします。

RecyclerViewをクリックするとListViewのように動作させるにはどうしたらいいですか?以下は

残念ながら、RecyclerViewはあなたのためにそれを処理しません

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

同時に2つのアイテムをクリックしていることをどのように把握していますか? –

+0

Recyclerviewはlistviewと異なり、同じ動作をします – kgandroid

+0

@PramodYadavをよくクリックするということは、タッチしてからタッチすることを意味します。たぶん私は私の説明で違った言い方をしていたはずです。基本的には、既にリストビュー内のアイテムに触れているとし、その間に別のアイテムに触れようとすると、それはあなたに許されません。 Recyclerviewはそれを可能にし、これは私が問題を引き起こしていると思います。 – Kiki

答えて

6

私RecyclerViewは、プログラムで、Javaではなく、XMLに追加されます。そして、私はこれを試してみて、それが動作します:

mRecyclerView.setMotionEventSplittingEnabled(false); 

あなたRecyclerViewがXMLに追加している場合、あなたはRecyclerViewでこれを追加してみてください可能性があります、リスト内の

android:splitMotionEvents="false"; 

そして今、あなたは一つの項目をクリックしたとき他のアイテムをクリックすることはできません。

0

私の実装です。タイムアウトとHandlerを作成します。

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" ' – HBG

+0

を呼び出すことでこれをうまく処理します。いいえ、この属性は、1つの行を高速にクリックして(リリースを押す)いくつかの問題を克服しません。また、1つの行に2つのインタラクティブな要素がある場合は、ほぼ同時に2つの要素を押すことができます。これは予期しない動作です。 –

関連する問題