문제 상황
RecyclerView의 아이템에 setOnClickListener온클릭리스너를 달아 뭔가 동작을 수행할 때
리사이클뷰가 있는 Activity의 context가 필요하면 그동안은 다 액티비티의 this를 전달해서 사용하니 해결되었다
그런데 액티비티를 종료하는 finish()나
startActivityForResult로 실행한 후 resultCode를 전달하는 setResult는
내가 해왔던 것처럼 Activity에서 this로 전달받은 context로는 사용할 수 없었다.
구글링하니 자바로 하는 방법은 많이 나오는데
해당 자바 코드를 kotlin에서 어떻게 활용해야할 지 몰랐고
kotlin으로 하는 방법은 찾기까지 시간이 꽤 걸렸기에 글쓴다.
꼭 RecyclerView나 ListView의 Adpater가 아니더라도 외부에서 Activity종료 등에 사용할 수 있을 것 같다.
본론
우선 Activity의 context를 this로 어댑터에 전달해준다. 어댑터에서는 mContext로 받았다.
private val activity : MainActivity = mContext as MainActivity
** MainActivity에는 자신이 context를 가져온 Activity명을 넣어주면 된다.
mContext와 위 코드를 사용해 activity를 만든다.
MainActivity.kt 주요코드
val mAdapter = PlaceAdapter(addressList, this)
binding.rvAddressResultList.adapter = mAdapter
이렇게 어댑터에 this로 Activity의 context를 전달해주고
(addressList는 내가 리사이클러뷰에 띄울 데이터 목록이다)
PlaceAdapter.kt 주요코드
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AddPlaceSearchResultAdapter.CustomViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item_address_search_result, parent, false)
return CustomViewHolder(view).apply {
itemView.setOnClickListener {
// 온클릭리스너 내용...
// setResult하는 코드
val resultIntent = Intent(mContext, PlaceActivity::class.java)
resultIntent.putExtra("name", name)
val activity: MainActivity = mContext as MainActivity
activity.setResult(Activity.RESULT_OK, resultIntent)
// 액티비티 종료하는 코드
activity.finish()
}
}
}
나는 뷰홀더 안에서 리스너를 달았다.
activity.finish(),
activity.setResult() 이 부분이 주요 내용이다.
끝
번외
참고로 자바코드는 아래와 같다.
//java
((MainActivity)mContext).finish();
'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] EditText 내용 비어있는지 빈 칸 확인하기 null check (0) | 2021.08.14 |
---|---|
[Android/Kotlin] 많이 쓰이는 홍보 배너 형태의 뷰 만들기 : ViewPager2 (1) | 2021.08.11 |
메모) RecyclerView GridLayout 아이템 간 간격, 크기 조정 (0) | 2021.08.08 |
[Android/Kotlin] 하단 네비게이션 바 BottomNavigation 만들기, 프래그먼트 상태 유지 (0) | 2021.08.08 |
[Android/Kotlin] 다른 액티비티 실행 후 결과 받아오기 startActivityForResult, setRestult, 구 onActivityResult (0) | 2021.07.19 |