RecyclerView를 사용할 때 Item을 선택해서 수정하거나, 삭제하거나, 다른 Activity로 넘어가는 등의 동작을 한다.
이 때 Item이 가진 Position 값을 받아야 할 때 어떤 방식을 써야 할까?
OnItemTouchListener()를 이용한 Item Position 알아내기
publicclassMainActivityextendsAppCompatActivity{privateList<Item>list=null;privateRecyclerViewre;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);re=(RecyclerView)findViewById(R.id.recycler);re.setLayoutManager(newLinearLayoutManager(this));re.setAdapter(newRecyclerAdapter(list));re.addOnItemTouchListener(newRecyclerView.OnItemTouchListener(){@OverridepublicbooleanonInterceptTouchEvent(RecyclerViewrv,MotionEvente){// RecyclerView로 전달된 TouchEvent를 받는다.if(e.getAction()==MotionEvent.ACTION_DOWN){ViewreV=rv.findChildViewUnder(e.getX(),e.getY());intposition=rv.getChildAdapterPosition(reV);}returnfalse;//TouchEvent를 가로채지 않는다.}@OverridepublicvoidonTouchEvent(RecyclerViewrv,MotionEvente){// onInterceptTouchEvent의 반환 값이 true일 경우 TouchEvent를 가로채어 동작한다.}@OverridepublicvoidonRequestDisallowInterceptTouchEvent(booleandisallowIntercept){// Item이 상위 RecyclerView가 TouchEvent를 가로채길 원치 않을 때 호출된다.}});}}
OnItemTouchListener()에서 어떠한 동작을 시킬 때 if문(MotionEvent)을 사용하지 않으면 각 MotionEvent마다 실행되어 동작이 중복된다.
getChildAdapterPosition(View): Item의 Position 값을 가져온다.
OnClickListener()를 이용한 Item Position 알아내기
publicclassRecyclerAdapterextendsRecyclerView.Adapter{privateList<Item>list;privateintposition=0;publicRecyclerAdapter(List<Item>list){this.list=list;}@OverridepublicRecyclerView.ViewHolderonCreateViewHolder(ViewGroupparent,intviewType){Viewview=LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);finalRecyclerHolderholder=newRecyclerHolder(view);holder.itemView.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){position=holder.getAdapterPosition();}});holder.itemView.setOnLongClickListener(newView.OnLongClickListener(){@OverridepublicbooleanonLongClick(Viewview){position=holder.getAdapterPosition();returntrue;// Click 구분 위해 true. LongClick 시 onClick도 함께 되는 것을 방지.}});returnholder;}@OverridepublicvoidonBindViewHolder(RecyclerView.ViewHolderholder,intposition){RecyclerHolderrH=(RecipeViewHolder)holder;...}@OverridepublicintgetItemCount(){returnlist.size();}privateclassRecyclerHolderextendsRecyclerView.ViewHolder{...publicRecyclerHolder(ViewitemView){super(itemView);...}}}
RecyclerView 외부에서 RecyclerView.OnClickListener()을 사용할 경우 제대로 안 먹히는 경우가 발생한다.
Click Event를 통해 Item에 따라 RecyclerView 외부의 변수를 변경하고 싶을 때는 OnItemTouchListener().
Click Event를 통해 Dialog 창을 띄우거나 화면을 넘기는 등 하고 싶을 때는
RecyclerView 내부의 Adapter에서 ItemView.OnClickListener()를 사용하는 것을 권장한다.