IT_Programming/Android_Java

[펌] RecyclerItemClickListener - RecyclerView에서 OnItemClickListener 구현

JJun ™ 2016. 1. 22. 16:56



 출처

 http://blog.naver.com/dntjd207/220604313561

 : http://blog.daum.net/andro_java/1169






출처 : (Jacob Tabak) http://stackoverflow.com/questions/24471109/recyclerview-onclick/24471410


자그마한 클래스 파일 하나만 만들어 사용하면 된다.


아이템뷰를 컨트롤하는 데만 사용 가능하며, 아이템 내부의 각 뷰는 어댑터 클래스에서 컨트롤해야 된다.


1. 사용법


리스너를 붙이는 rv_audios 이름이 리스너의 둘째 파라미터로 그대로 들어간다.


        rv_audios.addOnItemTouchListener(

                new RecyclerItemClickListener(context, rv_audios ,new RecyclerItemClickListener.OnItemClickListener() {

                    @Override public void on ItemClick(View view, int position) {

                        playMusic(audioList.get(position).getMusicID());

                    }

                    @Override public void on LongItemClick(View view, int position) {

                        // do whatever

                    }

                })

        );


2. 클래스


package net.kbh.simple;


import android.content.Context;

import android.support.v7.widget.RecyclerView;

import android.view.GestureDetector;

import android.view.MotionEvent;

import android.view.View;


// (Jacob Tabak) http://stackoverflow.com/questions/24471109/recyclerview-onclick/24471410#24471410

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {

    private on ItemClickListener mListener;


    public interface on ItemClickListener {

        public void on ItemClick(View view, int position);


        public void on LongItemClick(View view, int position);

    }


    GestureDetector mGestureDetector;


    public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, on ItemClickListener listener) {

        mListener = listener;

        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {

            @Override

            public boolean on SingleTapUp(MotionEvent e) {

                return true;

            }


            @Override

            public void on LongPress(MotionEvent e) {

                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());

                if (child != null && mListener != null) {

                    mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));

                }

            }

        });

    }


    @Override public boolean on InterceptTouchEvent(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 on TouchEvent(RecyclerView view, MotionEvent motionEvent) { }


    @Override

    public void on RequestDisallowInterceptTouchEvent (boolean disallowIntercept){}

}