[안드로이드] RecyclerView [2] OnItemClick 리스너 구현



RecyclerView 에서는 ListView에서와는 다르게

ClickListener 를 따로 구현해서 등록해줘야합니다.

Adapter에서 OnClick 를 구현해줘도 되고 제가 구현한 방법 처럼 따로 클래스를 만들어서

ItemTouchListener 를 구현해도 됩니다.


1. Result


2. Step by Step

2-1. RecyclerView 구현

안드로이드 RecyclerView 의 간단한 구현 방법은 이전 포스팅 글로 대체 하겠습니다.

[[안드로이드] RecyclerView 간단한 사용법]


2-2. OnItemTouchListener

RecyclerItemClickListener.java

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    private OnItemClickListener mListener;

    public interface OnItemClickListener {
        void onItemClick(View view, int position);

        void onLongItemClick(View view, int position);
    }

    GestureDetector mGestureDetector;

    public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
        mListener = listener;
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && mListener != null) {
                    Log.d("long","press");
                    mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
                }
            }
        });
    }

    @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        View childView = view.findChildViewUnder(e.getX(), e.getY());
        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
            mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
            return true;
        }
        return false;
    }

    @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }

    @Override public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
}


2-3. addOnItemTouchListener

mainBinding.recyclerView.addOnItemTouchListener(
        new RecyclerItemClickListener(getApplicationContext(), mainBinding.recyclerView, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(getApplicationContext(),position+"번 째 아이템 클릭",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLongItemClick(View view, int position) {
                Toast.makeText(getApplicationContext(),position+"번 째 아이템 롱 클릭",Toast.LENGTH_SHORT).show();
            }
        }));


3. Soruce code

전체 소스 코드는 Github 에 연동해놨습니다.

MainActivity에서 Data Binding을 사용하였습니다.




[Recycler View 시리즈]

  1. [안드로이드] RecyclerView [1] 간단한 사용법
  2. [안드로이드] RecyclerView [2] OnItemClick 리스너 구현
  3. [안드로이드] RecyclerView [3] Divider 구분선 넣기