RecyclerView 클릭 이벤트의 두 가지 방법

recyclerview 자체는 클릭 이벤트의 리셋을 가지고 있지 않습니다. 다음은recyclerview 클릭 이벤트를 실현하는 두 가지 방식입니다.
1. 인터페이스를 통해 리셋하는 방식:
직접 코드에 주석을 달다.
import android.view.View;

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

2、recyclerview의adapter에서 클릭 방법 실현
public class CardAdapter extends RecyclerView.Adapter {
    public OnItemClickListener mOnItemClickListener;//    

    public  void setOnItemClickListener(OnItemClickListener onItemClickListener ){
        mOnItemClickListener=onItemClickListener;
    }


@Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.fragment_card, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        holder.mItem = mValues.get(position);
        holder.mTimeView.setText(mValues.get(position).time);
       

        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (null != mListener) {
                    // Notify the active callbacks interface (the activity, if the
                    // fragment is attached to one) that an item has been selected.
                    mListener.onListFragmentInteraction(holder.mItem);
                }
            }
        });

        if (mOnItemClickListener != null) {
            holder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = holder.getLayoutPosition();
                    mOnItemClickListener.onItemClick(holder.mView,position);
                }
            });
        }

       

    }

    @Override
    public int getItemCount() {
        return mValues.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public final View mView;
        public final TextView mTimeView;
        
        public DummyItem mItem;

        public ViewHolder(View view) {
            super(view);
            mView = view;
            mTimeView = (TextView) view.findViewById(R.id.certLibFileTime);
            
        }
    }
}

3、activity에서 사용
CardAdapter cardAdapter = new CardAdapter(CardDummyContent.ITEMS, mListener,context);
cardAdapter.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(View view, int position) {
                String fileName = CardDummyContent.ITEMS.get(position).time;
                Log.i(TAG,"cardName:"+fileName);
                
            }
        });

 
 
2, recyclerview의addOnItemTouchListener를 통해 클릭 이벤트 구현
1. 우선 클래스RecyclerItemClickListener를 정의하여RecyclerView를 실현한다.OnItem Touch Listener 인터페이스, onLong Press () 방법을 다시 쓰는 방법, onIntercept Touch Event () 방법, onTouch Event () 방법, onRequest Disallow Intercept Touch Event () 방법을 이 클래스 내부에 클릭해서 감청하는 인터페이스interface OnItem Click Listener를 정의하고 인터페이스 내부에 두 가지 방법인 onItem Click (), onLong Click () 을 설정합니다. 
public static class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
        GestureDetector mGestureDetector;
        private View childView;
        private RecyclerView touchView;

        public RecyclerItemClickListener(Context context, final HomePageFragment.RecyclerItemClickListener.OnItemClickListener mListener) {
            mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onSingleTapUp(MotionEvent ev) {
                    if (childView != null && mListener != null) {
                        mListener.onItemClick(childView, touchView.getChildPosition(childView));
                    }
                    return true;
                }

                @Override
                public void onLongPress(MotionEvent ev) {
                    if (childView != null && mListener != null) {
                        mListener.onLongClick(childView, touchView.getChildPosition(childView));
                    }
                }
            });
        }

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

            void onLongClick(View view, int posotion);
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            mGestureDetector.onTouchEvent(e);
            childView = rv.findChildViewUnder(e.getX(), e.getY());
            touchView = rv;
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {

        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

        }
    }

 
2. 우리의 레이아웃에 정의된recyclerview 추가 방법addOnItemTouchListener()
rc_view.addOnItemTouchListener(new RecyclerItemClickListener(this,new RecyclerItemClickListener.OnItemClickListener() {
  public void onItemClick(View view, int position) {
           //             
  }
   @Override
            public void onLongClick(View view, int position) {
            //             
            //    Toast.makeText(getContext(), "  ", Toast.LENGTH_SHORT).show();
            }
 }

좋은 웹페이지 즐겨찾기