1. 최종 프로젝트 3주차
시간 참 빠르다.
분명 계획하고 개발에 들어간 지가 엊그제 같은데 벌써 2주가 지나고 3주차가 다가왔다.
이제는 정말로 MVP(Minimum Viable Product)를 완성해야 하는 기간이 코앞까지 다가왔기에, 힘을 내서 진행하자.
자동 스크롤 & 무한 스크롤
우선, 현재 산 리스트 Fragment가 완성이 안 되서 테스트용 파일을 따로 만든 다음 코드를 복붙해서 돌려봤다.
자동 스크롤 자체에는 아무런 문제가 없다.
다만, 여기서 몇 가지 문제점들이 발견되었는데
- 마지막 이미지로 넘어가기 직전, 앱이 강제종료되는 문제가 발생했다. 알고보니 lateinit 변수가 초기화되지 않아서라고 되어 있어서 viewPager2를 아예 객체로 집어넣어서 해결했다.
class SanImageAdapter( var mItems: MutableList<SanDetailImageData>, private val viewPager2: ViewPager2 ) : RecyclerView.Adapter<SanImageAdapter.Holder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { val binding = ItemAdapterMountainBinding.inflate(LayoutInflater.from(parent.context), parent, false) return Holder(binding) } override fun onBindViewHolder(holder: Holder, position: Int) { holder.mountainImage.setImageResource(mItems[position].img) if (position == mItems.size - 1) { viewPager2.post(runnable) } } override fun getItemCount(): Int { return Int.MAX_VALUE } inner class Holder(val binding: ItemAdapterMountainBinding) : RecyclerView.ViewHolder(binding.root) { var mountainImage = binding.ivMountain } private val runnable = Runnable { mItems.addAll(mItems) notifyDataSetChanged() } }
- 어떤 이미지는 부드럽게 넘어가고, 어떤 이미지는 뚝뚝 끊기듯이 넘어가는데 아무래도 각 이미지 파일마다 용량이 달라서 그런 것이 아닌가하는 생각이 든다.
- 어떤 이미지는 용량이 너무 커서 중간에 용량초과로 앱이 강제종료되는 문제가 발생했다. 이건 그 파일의 크기를 줄여서 어느정도 해결했다.
이번에는 각 산마다 이미지를 따로 출력하는 기능을 구현하자.
말했다시피, 이미지 파일은 api로 따로 받아올 수가 없어서 쌩노가다로 데이터를 넣을 수밖에 없었다.
val kyeryongsanList = mutableListOf(
SanDetailImageData("계룡산", R.drawable.img_kyeryongsan1),
SanDetailImageData("계룡산", R.drawable.img_kyeryongsan2),
SanDetailImageData("계룡산", R.drawable.img_kyeryongsan3),
SanDetailImageData("계룡산", R.drawable.img_kyeryongsan4),
SanDetailImageData("계룡산", R.drawable.img_kyeryongsan5)
)
val naejangsanList = mutableListOf(
SanDetailImageData("내장산", R.drawable.img_naejangsan1),
SanDetailImageData("내장산", R.drawable.img_naejangsan2),
SanDetailImageData("내장산", R.drawable.img_naejangsan3),
SanDetailImageData("내장산", R.drawable.img_naejangsan4),
SanDetailImageData("내장산", R.drawable.img_naejangsan5)
)
이런 식으로 말이다.
(객체에 산 이름을 집어넣은 이유는 혹시나 싶어서 우선 넣어뒀고 나중에 필요 없어지면 바로 삭제할 예정)
그 다음, 산의 이름 또한 어차피 산 리스트 Fragment에서 받아올 거니 이걸 기준으로 이미지를 분류하기로 했다.
val mountain = binding.tvMountain.text
imageAdapter = when (mountain) {
"계룡산" -> SanImageAdapter(kyeryongsanList, binding.vpMountain)
"내장산" -> SanImageAdapter(naejangsanList, binding.vpMountain)
"북한산" -> SanImageAdapter(northhansanList, binding.vpMountain)
"설악산" -> SanImageAdapter(seullacksanList, binding.vpMountain)
"소백산" -> SanImageAdapter(sobaeksanList, binding.vpMountain)
"속리산" -> SanImageAdapter(sokrisanList, binding.vpMountain)
"오대산" -> SanImageAdapter(odaesanList, binding.vpMountain)
"지리산" -> SanImageAdapter(jirisanList, binding.vpMountain)
else -> SanImageAdapter(hanrasanList, binding.vpMountain)
}
binding.vpMountain.adapter = imageAdapter
binding.vpMountain.orientation = ViewPager2.ORIENTATION_HORIZONTAL
이제 기능 딱 하나 완성되었다.
아직 갈 길은 머니 조금 더 힘차게 달려가자.
좋아요 기능
내가 맡은 역할 중에서 가장 난이도가 높은 작업을 꼽으라면 단연 이 기능이 아닐까 싶다.
이 좋아요 기능을 간략하게 요약하자면 'MountainDetailActivity에서 북마크를 누르면 MyInfoFragment에서 보여주는 것'이기 때문에 복합적인 요구사항들을 요한다.
구체적으로 어떤 걸 구현해야 하냐면
- MountainDetailActivity
- 북마크를 누르면 true, false 중 하나의 값에서 그 반대로 바뀌고, 북마크 버튼이 바뀌어야 함
- 이 Boolean 값이 MyInfoFragment에 전달되어야 함
- MyInfoFragment
- 북마크한 산 리스트만 보여줘야 함
- 앱이 종료가 되어도 북마크한 산 리스트가 유지되어야 함(SharedPreference)
여태껏 수많은 경우의 좋아요 기능들을 다 겪어봤지만, 역시 최종 프로젝트다보니 그 난이도가 차원이 다르다.
이건 처음에 어디서 어떻게 시작해야 하는지 꼼꼼하게 들어가고 시작해야지 안 그러면 중간에 꼬일 가능성이 굉장히 높다.
따라서, 이건 대충 이렇게 견적만 따로 보고 여러 군데에서 자료들을 참조한 다음에 도전하기로 했다.
'[TIL][내일배움캠프]' 카테고리의 다른 글
[내일배움캠프][TIL] 24.03.06 (수) - 최종 프로젝트 3주차 : 개발 7일차 (2) | 2024.03.06 |
---|---|
[내일배움캠프][TIL] 24.03.05 (화) - 최종 프로젝트 3주차 : 개발 6일차 (0) | 2024.03.05 |
[내일배움캠프][TIL] 24.02.29 (목) - 최종 프로젝트 2주차 : 개발 4일차 (2) | 2024.02.29 |
[내일배움캠프][TIL] 24.02.28 (수) - 최종 프로젝트 2주차 : 개발 3일차 (1) | 2024.02.28 |
[내일배움캠프][TIL] 24.02.27 (화) - 최종 프로젝트 2주차 : 개발 2일차 (1) | 2024.02.27 |