본문 바로가기

[TIL][내일배움캠프]

[내일배움캠프][TIL] 24.03.04 (월) - 최종 프로젝트 3주차 : 개발 5일차

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)

 

여태껏 수많은 경우의 좋아요 기능들을 다 겪어봤지만, 역시 최종 프로젝트다보니 그 난이도가 차원이 다르다.

이건 처음에 어디서 어떻게 시작해야 하는지 꼼꼼하게 들어가고 시작해야지 안 그러면 중간에 꼬일 가능성이 굉장히 높다.

 

따라서, 이건 대충 이렇게 견적만 따로 보고 여러 군데에서 자료들을 참조한 다음에 도전하기로 했다.