RecyclerView 아이템 클릭 이벤트 구현 [Android, JAVA]
반응형

 

보통 RecyclerView를 사용하면 Adapter를 사용해서 내부 아이템을 관리하게 된다.

여기서 각 아이템을 클릭했을 때 -> 화면을 이동시키고 싶은데, NavController를 어댑터에 넘겨주자니 뭔가 애매한 경우가 있다.

나아가 클릭 이벤트 발생 시 아이템 내부가 아니라 프래그먼트에서 처리해야 할 때, 그 동작을 아이템 외부로 넘겨줘야 하는 경우에 다음 방법을 사용할 수 있다.

과정 : 상점 목록에서 상점 클릭 시 상점 세부화면으로 이동
문제 : RecyclerView Adapter의 Viewholder에서 클릭 이벤트로 프래그먼트 전환

 

ClickListener 인터페이스 활용

다음과 같은 구조로 클릭 이벤트를 처리하면 쉽게 어댑터 외부 (프래그먼트)에서 클릭 이벤트를 처리할 수 있다.

클릭 시 동작을 전달할 OnItemClickListener라는 인터페이스를 선언한 뒤, 프래그먼트에서 그 동작을 구현해주면 쉽게 외부에서 처리할 수 있다.

 

어댑터 내부에 인터페이스 선언

/*** 어댑터 (ShopListAdapter) ***/

private OnItemClickListener itemClickListener;

//인터페이스 선언
public interface OnItemClickListener{
    //클릭시 동작할 함수
    void onItemClick(View v, int pos);
}

public void setOnItemClickListener(OnItemClickListener listener){
        this.itemClickListener = listener;
}

//이후 내부에 선언한 ViewHolder에서 클릭 시 동작 호출
 public class ViewHolder extends RecyclerView.ViewHolder{
        ItemShopInfoBinding binding;

        public ViewHolder(ItemShopInfoBinding binding){
            super(binding.getRoot());
            this.binding = binding;

            //아이템 클릭 시 (전체)
            binding.getRoot().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    //존재하는 포지션인지 확인
                    int pos = getAdapterPosition();
                    if(pos != RecyclerView.NO_POSITION){
                        //동작 호출 (onItemClick 함수 호출)
                        if(itemClickListener != null){
                            itemClickListener.onItemClick(v, pos);
                        }
                    }
                }
            });
        }

        public void bindItem(){
            //....
        }

어댑터 외부 (프래그먼트)에서 동작 처리

프래그먼트에서는, 어댑터 내부의 OnclickLisener를 구현하여서, 클릭 시 실행되야 하는 동작을 구현할 수 있다.
이러면 굳이 NavController를 어댑터 내부로 넣어주지 않아도 밖에서 화면을 전환시킬 수 있다.

/***프래그먼트 (ShopListFragment) ***/
shopListAdapter.setOnItemClickListener(new ShopListAdapter.OnItemClickListener() {
        //동작 구현
        @Override
        public void onItemClick(View v, int pos) {
            //해당 매장을 검색조건으로 이동하도록
            navController.navigate(ShopListFragmentDirections.actionShopListFragmentToShopGraph(
                    shopListAdapter.getShopLists().get(pos).getStoreId())
                    .setDistance(shopListAdapter.getShopLists().get(pos).getDistance()));
        }
}

 

동작

터치이펙트가 없어서 밋밋하다

참고

혹시 궁금할까봐 리사이클러뷰에 어댑터 연결한 부분도 첨부한다.

//리사이클러뷰에 레이아웃매니저 설정 (Linearlayout으로)
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false);
binding.recyclerViewShopList.setLayoutManager(layoutManager);

//어댑터 내부 아이템 설정 -> 어댑터 안에서 Viewholder에 붙임
shopListAdapter.setShopLists(homeViewModel.getShopList().getValue());

//리사이클러뷰에 어댑터 설정
binding.recyclerViewShopList.setAdapter(shopListAdapter);

 

 

전문가가 아니라 정확하지 않은 지식이 담겨있을 수 있습니다.
언제든지 댓글로 의견을 남겨주세요!

반응형