[Android] recyclerView 생성시 중간부터 생성될때


recyclerView 아이템이 뿌려줄때 리사이클러뷰의 처음이 아닌 중간부분 부터 보이는 문제가 발생했다.

이 문제는 아이템이 생성될때 실행되는 순서에 문제가 있었던것이다!

어느것이 먼저 동작을 실행할지순서를정해주는 방법으로 오류를 고칠 수 있었다.

시도 1 : scrollToPosition 사용하기

//최상단으로 스크롤
private fun scrollTop() = with(binding) {
    rvArena.smoothScrollToPosition(0)
}
  • 리사이클러뷰에 자동으로 최상단으로 스크롤을 해주는 smoothScrollToPosition을 사용중 이였다.

  • 스무스 스크롤이 동작이느리기 때문에 중간부터 아이템이 보인다고 생각하여 scrollToPosition 로 수정했다.
  • scrollToPosition: 제일0번째 화면이 보이긴 하지만, 부드럽게 이동하지 않고 바로 화면을 보여주는방식이라 끊겨보이게 동작함.
  • 검색이 끝난 후 0번째로 보여질 수 있도록 함수 위치를 수정해보았지만 똑같은 오류가 발행했다.

시도 2 : 검색을 한 후 스크롤 되도록 하기

btnSoccer.setOnClickListener {
            searchArena("축구장")
            scrollTop()
            binding.btnFutsal.isChecked = false
            binding.btnSoccer.isChecked = true
            binding.btnBowling.isChecked = false
            binding.btnBasketball.isChecked = false
            binding.btnBadminton.isChecked = false
        }
  • 검색이다 되지 않았는데 스크롤을해 발생하는 문제인가 하여
  • 검색동작을 완료한 후 scroll을 할수 있도록 위치를 변경해주었지만 역시나 같은문제가 발생했다!

시도 3 : 리사이클러뷰 딜레이 주기

private fun scrollTop() = with(binding) {
    //약간 딜레이를 주는것
    rvArena.post {
        rvArena.scrollToPosition(0)
    }// 최상단으로 스크롤
}
  • 리사이클러뷰 동작이 너무 빨라 생성되기전 스크롤을 하기때문에 발생하는 문제인가 하여
  • post{} 함수를 사용해 리사이클러뷰가 조금의 딜레이를 가지고 최상단으로 이동할 수 있도록 해주었다.

하지만 역시나 문제가 발생했다.

시도 4 : 해결방법!

list.observe(this@ArenaActivity, Observer {
            if (it.isEmpty()) {
                binding.tvEmpty.visibility = (View.VISIBLE)
                listAdapter.submitList(it)
            } else {
                binding.tvEmpty.visibility = (View.INVISIBLE)
                listAdapter.submitList(it){
                    //{}아이템을 다 그리고 난후 콜백! 실행
                    //리스트가 모든걸 생성후 최상단으로 스크롤
                    scrollTop()
                }
            }
        })
  • 내가 구현한 리사이 클럽뷰 동작은 알맞은 검색어에 맞춰 아이템을 뿌려주는 방식이 였기때문에

  • listAdapter가 아이템을 다 그리고 난 후 콜백 할 수 있도록 {} 를 사용해서 순서를 지정해주었다.

트러블 슈팅의 문제점

  • 리사이클러뷰의 아이템 생성 순서와 스크롤 동작에 대한 이해 부족
    • smoothScrollToPosition은 아이템 생성이 완료된 후 스크롤을 하기 때문에, 아이템이 중간 부분부터 보이는 문제가 발생
    • 검색을 한 후 스크롤을 하도록 하는 것도, 아이템 생성이 완료된 후 스크롤을 하기 때문에 같은 문제가 발생
    • 리사이클러뷰에 아이템을 뿌릴 때는, 아이템 생성이 완료된 후 스크롤을 해야 한다는 점을 이해하지 못했던 것
  • submitList의 활용에 대한 이해 부족
    • submitList는 아이템 생성이 완료되면 콜백을 제공함
    • 이 콜백을 활용하면, 아이템 생성이 완료된 후 스크롤을 할 수 있음
    • submitList의 활용에 대한 이해 부족으로 인해, 콜백을 활용하지 못해 문제를 해결하지 못했던 것

느낀점

  • 리사이클러뷰의 아이템 생성 순서와 스크롤 동작에 대한 이해가 중요하다.
    • 리사이클러뷰에 아이템을 뿌릴 때는, 아이템 생성이 완료된 후 스크롤을 해야 한다는 점을 이해해야 한다.
  • submitList의 활용은 아이템 생성 후의 콜백을 잘 이해하고 활용해야 한다.
    • submitList는 아이템 생성이 완료되면 콜백을 제공하므로, 이 콜백을 활용하면 아이템 생성이 완료된 후 스크롤을 할 수 있다.
  • 효과적인 트러블 슈팅은 문제의 원인을 파악하고 순차적으로 해결책을 시도하는 것이 중요하다.
    • 문제의 원인을 파악하지 않고 무작정 해결책을 시도하면, 오히려 문제를 악화시킬 수 있다.

© 2023. All rights reserved.

AgileCatch