Parcelize를 사용하기 위해 플러그인을 추가해주는 것 부터 벅찼다. 플러그인을 추가해주는지도 몰랐다. 구글링을 통해서 id("kotlin-android-extensions")을 찾았는데, : Parcelable를 달았더니 뭘 override하라고 자꾸 빨간줄이 떠서.. override했더니 뭔가 못보던게 나오고.. 좀 더 찾아보니 굳이 override안해도 되는 것 같아서 보니까 parcelize에 대한 플러그인이 따로 있었다.
=> id("kotlin-parcelize") 이걸 app수준 gradle 상단에 있는 plugins{ }안에 넣어준 후 import kotlinx.parcelize.Parcelize를 임포트 받으니까 원하는 모양이 나왔다.
그런데 임포트해서, onClick 인터페이스 만든것도 어댑터에 선언해서, onBindViewHolder에 클릭이벤트도 연결해주고, 액티비티로 돌아와서 onClick을 override받아서 intent랑 putExtra도 걸어서 startActivity로 넘겨줬는데~ 클릭을 아무리해도 반응이 없었다. 클릭되는 소리는 들리는데. 종료되는 것도 아니고, 상세페이지가 아예 그냥 안뜨고 철저히 무반응.이여서, 상세페이지액티비티 코틀린 파일에 바인딩 연결을 안해줘서 그런건가 또 바인딩 해주고.. 바인딩 하다가 넘겨준 인텐트 받는 법으로 또 고생하고.
=> intent.getParcelableExtra("productData",ProductItem::class.java)가 아예 클래스를 매개변수로 받는 것으로 바뀌었다고 한다. 매개변수에 캐스팅 하고 싶은 클래스를 넣어주면 해당 클래스로 반환 받을 수 있다. 근데 티라미수 이전 버전에선 또 저 코드가 안먹혀서 if문을 통해 티라미수 이전버전에 대해 원래 사용했던 intent.getParcelableExtra<ProductItem>("productData")도 걸어줘야 했다.
//data클래스 형식을 가져서 intent를 받도록 설정.
private val productData : ProductItem? by lazy {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
// ProductItem타입으로 제한
intent.getParcelableExtra("productData",ProductItem::class.java)
} else {
// ProductItem타입으로 제한
intent.getParcelableExtra<ProductItem>("productData")
}
}
근데 생각해보면 바인딩 안해주면 빈칸으로 나올지언정 어쨋든 상세페이지는 떠야하는거잖아? 생각안해봐도 바인딩 걸었어도 여전히 무반응이었다.ㅎ 그래서 로그 찍어보는걸로 어디서부터 안되는지 추적해봤는데, 어댑터 holder에서는 클릭하면 로그가 찍히고, 메인액티비티코틀린파일에서 작성한 실행하고 싶은 이벤트 쪽은 로그가 전혀.안찍혔다. 전혀. 그래서 메인액티비티를 다시 천천히 보니까. 어제 리사이클 연결할 때 binding.productRecycle.adapter = ProductAdapter(dataList)으로 연결해놓고서는, 오늘 클릭이벤트 받아온다고 val adapter = ProductAdapter(dataList)를 또 작성해놔서, 리사이클러뷰에 데이터 한번, 어댑터에 데이터 한번씩 따로 따로 걸어줘서 서로 연결이 될 수가 없던 거였다. 정말.. 찾아서 얼마나 다행인지 정말로.....
=> 이렇게 binding.productRecycle.adapter에 adpater를 할당하고 코드를 작성했더니, 클릭이 아주 아주 아주 잘된다.
val adapter = ProductAdapter(dataList)
binding.productRecycle.adapter = adapter
...
adapter.productClick = object : ProductAdapter.ProductClick {
override fun onClick(view: View, position: Int) {
val intent = Intent(this@MainActivity, MainDetailActivity::class.java)
intent.putExtra("productData", dataList[position])
startActivity(intent)
}
}
사실 오늘 intent 넘기는걸로 한 두세시간 고생했다면,, UI 디테일 잡는데에도 한두시간 고생했다. 몇 안되는 하드코딩들 strings.xml에 넣어주고, 하는김에 colors.xml도 넣어주고 예시 사진이랑 계속 놓고 비교하면서 위치 잡아주고, 크기 잡아주고 뒤로가기 버튼도.. 테두리 있는 하얀색 이미지를 찾을라고 폭풍 웹서핑하고.. 하다하다 예시 글씨 크기랑 줄크기 비슷하게 맞춘다고 에뮬레이터를 몇번이나 껐다 켰는지.. 아이콘의 디테일은 좀 다르지만 이정도면 클론이라고.. 봐줬으면 좋겠다...
Parcelize 찾다가 본건데, 필수 구현 중에 🚩상품 가격은 1000단위로 콤마(,) 처리해주세요. 부분이 있었다. 나는 가격을 string으로 받았기 때문에 그냥 하드코딩을 했는데,, int로 받아서 DecimalFormat과 format으로 모양을 잡아주는 거였다. ㅎ 오늘은 기가 빨려서 그냥 그대로 놔뒀는데,, 해설영상에서.. 굳이.. 꼭.. 언급하겠지? 그럼 그때나 바꾸려고 한다.. 근데 생각해보면 마켓앱인데.. int로 받아주는게 맞긴 맞는 것 같은데.. 중고라서 장바구니 개념은 없었던 것 같은데.. 그래도.. 근데 지금은 말고 나중에 고칠거다..
문제를 풀고 해결하면서 내 나름대로 이래서 이런거구나~ 하고 판단을 내리는데. 문득 내가 생각한게 맞는지 걱정되긴 한다. 어쩄든 고쳐서 정상작동하고 있다는 점에 높은 점수를.. 혼자서 줘본다.ㅎ
이건 진짜 별말인데 이렇게 작성하는 법 알고 싶었는데 '그냥 싱글쿼터를 써도' 안돼서 뭘까 하다가 오늘 키보드를 보는데 `얘가 있었다. 너구나. ! ``을 사용하는게 훨씬 가독성이 올라간 것 같아서 뿌듯하다. 앞으로 잘 사용해야지
어제 생각한대로 오늘 스케쥴을 끝맞춰서 뿌듯하다. 내일은 오전 중에 도전과제를 끝내고 오후에 어려운 도전과제를 할 것이다. 도전과제는.. 스케쥴이 조금씩 밀릴것 같기도하고..? 어쨌든 목요일 12시 마감안에 해결되도록 하는 것이 최종 목표다. 그리고 목요일 오후에는 수준별 학습과제랑 해설영상 올라온거보고 보완과제를 하고 금요일 오후에 둘다 제출하는 것이 이번주 목표다! 파이팅!