web-dev-qa-db-ja.com

RecyclerViewをクリック不可能にして、onClickイベントを親ビューに渡す方法は?

RecyclerViewをクリック不可能にすることは可能ですか?私のRecyclerViewは、clickableCardView内にいくつかの小さなアイコンを表示するだけなので、これが必要です。したがって、誰かがアイコンをタップした場合は、代わりに親CardViewをクリック(およびアニメーション)するだけです。

私は以下を試しました:

  1. recyclerView.setClickable(false);
  2. recyclerView.setFocusable(false);
  3. RecyclerViewを拡張し、onTouchEvent(MotionEvent)falseを返すようにします。
  4. 上記の方法3を使用し、RecyclerViewアダプターでitemView.setClickable(false);を使用します。これは機能し、クリックは親に送信されます。ただし、RecyclerViewはスクロールできなくなりました。
  5. 膨張したリストアイテムXMLで_clickable="false"_、_focusable="false"_、_focusableInTouchMode="false"_を設定します。 (コメントを参照@ Ibrahim
  6. recyclerView#setLayoutFrozen(true)およびitemView.setClickable(false);を呼び出します。これは機能しますが、#4と同じ問題があります。

RecyclerViewのクリックイベントを無効にして親ビューに渡す方法はありますか? RecyclerViewは依然としてスクロール可能(水平)である必要があることに注意してください。


編集:
ユーザー @ c.dunlap OnClickリスナーをアイコンに設定し、クリックを親のクリックアクションに「リダイレクト」することをお勧めします。これは機能しますが、親ビューにクリックアニメーションはありません。また、誰かがitemViewの外側をクリックしても、RecyclerViewの内側(たとえば、ItemDecorationパディング)をクリックした場合、クリックは検出されません。残念ながら、これは解決策ではありません。

18
Thomas Vos

親ビューを拡張し、クリックをインターセプトして、recyclerviewがそれを受信しないようにする必要があります。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return true;
}

クレジット: ソリューション

9
nsL

このようなことを処理するための私の好ましい方法は、リサイクラービューの各アイコンがクリックされたときに呼び出されるアダプターからリスナーをアタッチすることです。その後、あなたの活動は適切な方法で対応することができます。例えば:

_public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private MyAdapterListener mListener;

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
         holder.itemView.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 mListener.iconClicked();
             }
         });
    }

    public void setListener(MyAdapterListener listener) {
        mListener = listener;
    }

    public interface MyAdapterListener {
        void iconClicked();
    }

}
_

次に、アクティビティでMyAdapterListenerのインスタンスを作成し、それをリサイクラービューのアダプターのリスナーとして設定します。次に、iconClicked()関数がトリガーされたときに、親クリックで実行されるコードを実行します。

3
c.dunlap