🐱 With All My Animal 🐶
💡 [ 26일차 11/14일 ] 💡
📌 오늘의 기술면접 질문 Q&A
📌 App 안에서 발생한 오류
에러가 발생하는 시기
- HomepageFragment에서 게시물을 클릭했을 때
- MypageFragment에서 내가 쓴 게시물을 클릭했을 때 등등
해결 방안: 초기화 방식과 변수 선언 방식 변경하기
수정 전 코드
private val startForResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
Log.d(TAG, result.resultCode.toString())
deletedKey = result.data?.getStringExtra("deletedPostKey")
?: return@registerForActivityResult
rvAdapter?.deletePost(deletedKey)
}
}
---------------------------------------------------------------------------------------------------
private fun setUpRecyclerView() {
rvAdapter = HomeRVAdapter(boardList) { intent ->
startForResult.launch(intent)
}
private var startForResult: ActivityResultLauncher<Intent>? = null
-------------------------------------------------------------------------------------------------------
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Log.d(TAG, "viewCreated 불리니")
startForResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
Log.d(TAG, result.resultCode.toString())
deletedKey = result.data?.getStringExtra("deletedPostKey")
?: return@registerForActivityResult
rvAdapter?.deletePost(deletedKey)
}
}
-------------------------------------------------------------------------------------------------------
private fun setUpRecyclerView() {
rvAdapter = HomeRVAdapter(boardList) { intent ->
startForResult?.launch(intent)
}
binding.rvHome.apply {
setHasFixedSize(true)
_binding = null
}
override fun onDestroy() {
startForResult = null
super.onDestroy()
}
에러가 발생하는 시기
- MypageFragment Like List 클릭했을 때
에러가 발생한 이유
- 인덱스 범위를 벗어나는 접근을 시도했을 때 발생한다.
- RecyclerView에서 adapterPosition은 현재 View Holder가 binding 되어있는 아이템의 위치를 나타내지만, 아이템이 아직 binding 되지 않았거나, binding이 해제되었을 경우에는 -1이 되어 인덱스의 범위를 벗어나는 접근이 되어버린다.
- adapterPosition이 유효하다는 것은 ViewHolder가 binding 된 상태라는 의미이지만, 그것이 반드시 list에 데이터가 있음을 보장하지 않는다.
init {
binding.root.setOnClickListener {
// 아래 두 줄 추가하기
val position = adapterPosition
if (position != RecyclerView.NO_POSITION && list.size > position) {
val clickedItem = list[adapterPosition]
val uid = clickedItem.uid
val key = clickedItem.key
val category = clickedItem.category