Friday, June 28, 2019

안드로이드에서 Fragment와 ViewPager 상태 갱신 문제 해결

안드로이드에서 fragment 와 viewpager가 조합될 경우 상태를 갱신 관련해서 여러 문제가 발생합니다.

Fragment 내 Child Fragment에서의 RecyclerView 갱신 문제

ViewPager 안에 Fragment가 있고 그 Fragment 안에 Child Fragment가 있는 구조였는데, 자식 Child Fragment 안에 있는 RecyclerView를 갱신하는 곳에서 문제가 발생했습니다.

소스는 아주 간단했습니다. RecyclerView에 아이템 추가/삭제의 기능을 하는 것인데 아이템을 추가해도 아이템이 보이지 않았습니다.

구글링을 해보고 온갖 방법을 써도 잘 풀리지 않아 반나절 정도 고통받았습니다. ViewPager의 adapter도 고쳐보고 RecyclerView의 adapter도 fragment에서 갱신해보고 adapter에서도 갱신해보고 item을 clear해서 넣어봤다가 new로 완전히 새로운 인스턴스를 넣어봤다가 adapter도 new로 만들어봤지만 모두 실패였습니다.

Solution: bringToFront 사용하기

여러 삽질 중 예전에 기억한 bringToFront라는 메소드를 사용해 보았습니다. 이 메소드는 층층의 뷰 중 가장 밑에 깔린 뷰를 가장 위로 올리는 기능입니다. 이 방법으로 문제를 해결할 수 있었습니다.

결론

Note: bringToFront가 필요했던 것입니다. Fragment 등이 섞이면서 뷰가 가려지는 것 같습니다. 자세한 원리는 나중에 알아보도록 하겠습니다.


1 comment:

  1. 안녕하세요.
    해당 글을 보고 문제가 비슷한 것 같은데 해결이 안되고 있어서 문의 남깁니다.
    저는 fragment안에 NestedScrollView안에 RecyclerView가 있고
    RecyclerView에서 버튼클릭해서 Dialog를 띄웁니다. 그리고 확인을 하면 RecyclerView의 해당 뷰가 갱신이 되어야하는데....
    Dialog에서 EditText가 있는데 아무 동작없이 확인을 하면 RecyclerView가 notifyItemChanged를 사용해서 잘 갱신이 됩니다.
    그런데 EditText에 포커스를 주고 키보드를 띄웠다가 확인을 하면 notifyItemChanged를 해도 갱신이 안되고 RecyclerView를 살짝 움직여야 onBindViewHolder를 타면서 갱신이 됩니다.
    혹시 해결방법이 있을까 싶어 문의 남깁니다...

    ReplyDelete