트러블슈팅
LiveData를 이용해 버튼을 누를 때 마다 새로운 List를 서버에서 전달받아 기존 List에 추가하려 했지만, 데이터를 전달받긴 하지만 기존 List가 갱신이 안되는 문제
해결 1 : MainActivity에서 RecyclerView랑 binding을 안해줬다 (초보적인 실수...)
private fun initRecyclerview() {
binding.mainRecyclerview.layoutManager = LinearLayoutManager(this@MainActivity) //추가한 코드
mainadapter = MainAdapter()
binding.mainRecyclerview.adapter = mainadapter
}
이렇게 하고보니까 진짜 문제가 보이기 시작했다
FATAL EXCEPTION: main
Process: com.android.helldivers2, PID: 8464
kotlin.UninitializedPropertyAccessException: lateinit property data has not been initialized
at com.android.helldivers2.presentation.MainAdapter.getItemCount(MainAdapter.kt:26)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:4214)
at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3680)...
** 로그캣 출력 중 일부 **
해결 2 : MainAdapter의 data에 초기값 설정을 안해줘서 생긴 문제였다.
private lateinit var data : List<StratagemData>
** 기존 코드, lateinit을 사용하고 초기화를 한 번도 안해서 생긴 문제이다 **
private var data : List<StratagemData> = emptyList()
** 수정한 코드, emptyList()를 사용하고 lateinit을 없앴다 **
이렇게 기존 List가 갱신이 안되는 문제는 해결했다. 하지만 문제를 해결하고 애뮬레이터에 UI를 띄워보니 새로운 문제가 하나 있었다. 내가 구현하고자 했던건 서버에서 전달받은 데이터를 기존 리스트에 '추가' 하는것이 목적이였는데, 실행되는 코드는 기존 리스트를 완전히 덮어씌워버렸다
해결 3 : data의 형식을 mutable로 바꾸고 updateData 로직 변경
private var data : List<StratagemData> = emptyList()
...
fun updateData( ... ) {
data = newData
...
}
** 기존 코드 **
private var data : MutableList<StratagemData> = mutableListOf()
...
fun updateData( ... ) {
data.addAll(newData)
...
}
** 수정된 코드, 똑같은 형식의 data를 추가하고 싶을 때는 .add가 아닌 .addAll을 사용해야 했다 **
코드를 수정하고 이제 정상적으로 기존 List에 전달받은 데이터가 추가되었다
'TIL' 카테고리의 다른 글
TIL 47일차 - 최종프로젝트 (0) | 2024.05.28 |
---|---|
TIL 46일차 - 최종프로젝트 (0) | 2024.05.27 |
TIL 44일차 (1) | 2024.05.01 |
TIL 43일차 (0) | 2024.04.30 |
TIL 42일차 (0) | 2024.04.19 |