[Troubleshooting] Fragment의 RecyclerView에서 다른 Fragment로 이동

IE·2023년 1월 18일
0

Troubleshooting

목록 보기
1/3

평화롭게 인스타그램 클론 코딩을 진행하던 도중 정말 화병나는 버그가 있었다.

사실 이걸 버그라고 해도 될지 모르겠지만 여하튼 간에 제대로 동작을 안 했으니 버그가 맞다.

위에 보이는 인스타그램 마이 페이지에서 나의 게시물(하단의 RecyclerView)을 선택하면 해당 유저의 게시물을 모아둔 UserPostFragment로 넘어가야 했다.

프래그먼트가 아니라 액티비티였다면 더 처리가 쉬웠을 것 같은데, 인스타그램에 들어가 보니 해당 페이지로 이동해도 바텀 네비게이션이 계속 살아있어서 프래그먼트로 작성했다.

여러 게시물을 찾아보고 번역하며 구글링 한 결과, 리사이클러뷰 어댑터에

interface ItemClickListener{
        fun onClick(view: View,position: Int)
    }
    
    private lateinit var itemClickListner: ItemClickListener
    fun setItemClickListener(itemClickListener: ItemClickListener) {
        this.itemClickListner = itemClickListener
    }

이런 처리를 하면 된다는 글을 여럿 보게 됐다.

그래서 해봤다.

처참했다.

lateinit property listener has not been initialized

listener가 나중에 꼭 초기화 되기로 약속해서 프로그램을 실행해주기 시작했는데, 초기화를 안 했다고 프로그램이 파업하면서 뜨는 에러다.

단순히 listener를 초기화 하기만 하면 해결될 문젠데 난 그게 안 됐다.
남의 코드를 복사 붙여넣기 해도 안 되고 내가 직접 작성해도 안 되고, 여러 솔루션을 찾아보고 따라해봐도 안 되기를 거의 2시간 30분 반복했다.

그러다가 찾게 된 유튜브 영상.

3분만에 내 2시간 30분을 끝내줬다.

해결 방법은 아래와 같다. 어댑터의 onBindViewHolder 함수 안에 아래의 코드를 넣으면 된다.

holder.itemView.setOnClickListener(object : View.OnClickListener {
            override fun onClick(v: View?) {
                val activity = v!!.context as AppCompatActivity
                val userPostFragment = UserPostFragment()
                activity.supportFragmentManager.beginTransaction()
                    .replace(R.id.fragment_container, userPostFragment).addToBackStack(null).commit()
            }
        })

물론 여기서 R.id.fragment_container 부분은 각자 프래그먼트가 들어갈 레이아웃을 넣어주면 된다.

itemClickListener를 따로 선언해주지 않고 바로 함수 안에 onClick 이벤트를 작성해주니 기존 Fragment(마이페이지 Fragment)를 건드릴 필요도 없이 해결됐다.

코드 분석은 나중에 해보기로 하고, 혹시 나와 같은 이유로 고생하고 있을 또 다른 사람을 위해 일단 게시물을 적어봤다. 또 내가 언제 까먹을지 모르기도 하고.

추후에 해당 코드를 리뷰해보고 해결법을 찾아봐야겠다.

아래는 내가 봤던 유튜브의 링크. 혹시 몰라 첨부해둔다.

RecyclerView Fragment To Fragment

profile
정위블

0개의 댓글