만드신 커스텀 뷰에 리스너를 다세요. 아래와 같은 형태로 리스너를 외부에 노출시키세요.
class MyCustomView(...) {
interface Listener {
fun onItemClicked()
}
var listener: Listener? = null
....
binding.aView.setOnclickListener {
listener?.onItemClicked()
}
}
이제 버튼 클릭 이벤트 리스너를 다는 것과 같은 패턴으로 처리하시면 됩니다. ViewModel에서 해당 이벤트 처리를 하게 되므로 LifecycleOwner는 필요가 없구요, ViewModelScope.launch 안에서 해당 이벤트를 처리하시면 됩니다.
// Activity or Fragment
private val viewModel by viewModels() // Koin을 이용해서 처리할 것.
myCustomView.listener = object: MyCustomeView.Listener {
override fun onItemClicked() {
viewModel.onAnswerClicked()
}
}
leftBtn.setOnClickListener {
viewModel.onGoToPrevious()
}
rightBtn.setOnClickListener {
viewModel.onGoToNext()
}
class MyViewModel: ViewModel() {
fun onAnswerClicked() {
// 선택한 답을 메모리나 스토리지에 저장/ LiveData에 설정.
}
fun onGoToPrevious() {
// 위에서 선택되었던 답을 검증하고 정답은 LiveData를 통해 뷰에 전달. 이전 문제로 이동.
}
fun onGoToNext() {
// 위에서 선택되었던 답을 검증하고 정답은 LiveData를 통해 뷰에 전달. 다음 문제로 이동.
}
}
Listener의 onItemClick 함수의 파라미터로 선택한 답을 넘기시면 원하는 답에 대한 처리가 가능하겠죠?
올려주신 코드가 없는 관계로 뼈대에 해당하는 코드만 작성했습니다.
2번 문제는 님이 뷰구조를 어떻게 가져가시느냐에 따라 처리방법이 달라지는데, 이것과 관련한 코드를 알 수가 없으므로 스킵하겠습니다.