LYnLab

소개블로그취미로그

RxJava로 RecyclerView의 ItemClick 이벤트 처리

RecyclerView에서는 ListView처럼 onItemClickListener를 설정할 수 없습니다. 이로 인해 발생하는 번거로운 작업을 RxJava를 이용하여 처리해보았습니다.

2016-12-12#프로그래밍

💡 이 글은 작성된지 1년 이상 지났습니다. 정보글의 경우 최신 내용이 아닐 수 있음에 유의해주세요.

RecyclerView에서는 ListView처럼 onItemClickListener를 설정할 수 없습니다.

대신하여 View.OnClickListener를 사용하려고 하면 어댑터와 뷰에 동시에 접근하기 위해 값을 파라미터로 넘기고 받는 작업이 무척 번거로워지는데요, RxJava를 이용하여 다음과 같이 처리해보았습니다.

아래 코드 예시에서는 클릭된 아이템의 position index를 Observable의 파라미터로 넘깁니다.

AwesomeAdapter.java

public class AwesomeAdapter extends RecycerView.Adapter<VH> {
        // 여기서는 Position index를 파라미터로 넘기기 위해 Integer 타입을 사용.
        private final PublishSubject<Integer> onItemClickSubject = PublishSubject.create();

        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
                ...
                // 여기서 RxJava를 사용하지 않고 그냥 onClickListener를 설정해주어도 되지만, 어댑터와 뷰에 모두 접근하기에 번거로워집니다.
                holder.itemView.setOnClickListener(v -> onItemClickSubject.onNext(holder.getAdapterPosition()));
        }
        ...
        public Observable<Integer> getOnItemClickObservable() {
                return onItemClickSubject.asObservable();
        }
}

AwesomeActivity.java

public class AwesomeActivity extends BaseActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                MyAwesomeAdapter adapter = new MyAwesomeAdapter();
                adapter.getOnItemClickObservable().subscribe(position -> /* 뷰 작업 */);
        }
}

관련된 글

Rails와 GitHub Actions에 커버리지 레포트를 달아보자

이 블로그의 CMS이기도 한 Shiori를 대폭 리팩토링하면서 테스트가 얼마나 잘 작성되어있는지 궁금해졌습니다.

Rails Global ID로 전역 객체 식별하기

Global ID는 Rails의 모든 객체를 식별할 수 있는 URI(Uniform Resource Identifier)입니다.

Ruby on WebAssembly: 살짝 맛보기

Ruby 3.2에 추가된 WebAssembly 지원을 간단하게 테스트해봅시다.

작성한 댓글은 giscus를 통해 GitHub Discussion에 저장됩니다.

크리에이티브 커먼즈 라이선스크리에이티브 커먼즈 저작자표시크리에이티브 커먼즈 동일조건변경허락

본 사이트의 저작물은 별도의 언급이 없는 한 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2024 Hoerin Doh, All rights reserved.

LYnLab 로고About MeGitHubTwitterInstagram