RxJava로 RecyclerView의 ItemClick 이벤트 처리

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

2016. 12. 12. #android

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 -> /* 뷰 작업 */);
        }
}
크리에이티브 커먼즈 라이선스

이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2020 Do Hoerin, LYnLab