보통 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);
전문가가 아니라 정확하지 않은 지식이 담겨있을 수 있습니다.
언제든지 댓글로 의견을 남겨주세요!
'코딩 > 안드로이드' 카테고리의 다른 글
안드로이드 이메일, 비밀번호 입력 폼 (머테리얼 디자인) [Android, JAVA] (1) | 2022.03.12 |
---|---|
안드로이드 트리 구조 리사이클러뷰 구현 (접었다 폈다) [Android, JAVA] (2) | 2022.02.19 |
안드로이드 Daum 주소 검색 API 활용하기 [Android] (6) | 2022.02.18 |
JetPack 직전 DialogFragment 값 받아오기 (BackStackEntry, SavedStateHandle) [Android (0) | 2022.02.11 |
React-Native Network Request Failed Error [Android] (0) | 2021.02.16 |
Comment