본문 바로가기

나의 플랫폼/안드로이드

[Android][Glide] Viewpager 에 이미지가 갱신 되지 않는 현상

이 내용은 많이 발생 하지 않는 문제 입니다. 

UI가 좀 복잡해지게 되면 일어날 수가 있는데요.


안드로이드 이미지를 로드하기 위해 요즈음 많이 사용하는 Library가 Glide 입니다.

Picasso도 있고, Universal Image Loader도 있는데요.


전 가볍고 기능도 많은 Glide를 많이 사용 합니다.


Glide 를 쓰게 되면 아래와 같은 문제점이 발생했습니다.

(다른 라이브러리들은 발생하지 않음)


ViewPager 안에서 ListView,RecyclerView,GridView 같은 Adapter를 필요로 하는 View가 포함 되어 있는 상태에서,

해당 View에 이미지를 재로드 할 때 이미지가 발생 하지 않는 현상 발생.


참고 : https://groups.google.com/forum/#!topic/glidelibrary/VZnxfhbepp4


한마디로 ViewPager는 4Page 이상 될 경우 2Page 정도 이동이 되고 나서는 기존 Page가 onStop을 호출해 버립니다.

즉 갱신이 되는 거죠. 무슨 말이냐면요^^a


■ 현재 보이는 페이지 □ 보이지 않는 페이지


      1              2              3            4

     ■             □             □           □



- 아래와 같은 상태에서는 1번 페이지가 갱신 됩니다.


      1              2              3            4

     □             □             □           ■


※상황에 따라 3번 페이지가 보일 때도 1번 피에지가 갱신이 되기도 합니다.



그래서 다시 2번 페이지로 이동이 되었을 때, 1번 페이지에서는 onStart를 호출 합니다.

이런 식으로 해서 ViewPager에서는 갱신이 이뤄지는데요.


1번페이지에 갱신이 이뤄질 때 이미지가 보이지 않는 현상이 발생하는 문제 입니다.

전에도 말씀 드렸듯이 Glide 라이브러리를 사용할때 발생 합니다.


(죄송... 제가 설명을 잘 못해서.. 이해해 주세요. 먼가 더 자세한 설명을 원하시면 댓글 달아주세요.)


그럼 어떻게 해결을 하면 되느냐~


ViewPager에 있는 Adapter를 갱신 시켜 주세요!



ViewPager Adapter에 포함되어 있는 ListView나 Fragment(FragmentStatePagerAdapter 사용했을때) 에 있는 Adapter를 갱신 하는 겁니다.


ListView의 Adapter를 아래와 같이 다시 셋팅 하는 거죠.

private void setAdapter(List<?> list) {
mAdapter = new RecyclerAdapter(this);
mListView.setAdapter(mCastAdapter);
GridLayoutManager manager = new GridLayoutManager(getActivity().getBaseContext(), 2
, GridLayoutManager.VERTICAL, false);
mListView.setLayoutManager(manager);
mListView.setNestedScrollingEnabled(false);
}

private void refreshCastAdapter() {
if (mAapter == null) return;
List<?> list = mAdapter.getItems();
setAdapter(list);
}
@Override
public void onStart() {
super.onStart();
refreshCastAdapter();
}


onStart가 호출 될 때 Adapter를 다시 생성해 주면 됩니다.

Glide 에서 이미지가 나오지 않는 문제는 ViewPager에서 onStop을 시킬 때 메모리에서 이미지가 지워지는데,

onStart 할 때 갱신이 되지 않을 경우 그 지워진 이미지로 보이기 때문에 발생하는 문제 에요.


따라서 onStart를 할 때 Adapter를 다시 한번 갱신이나 생성을 해주시면

이미지가 문제 없이 잘 보이는 것을 확인 할 수 있습니다.


좀더 자세한 문의 사항이나 궁금하신 점이 있으면 댓글 달아 주세요.

설명이 부족하여 죄송합니다.


감사합니다.






  • 목마른어른양 2017.01.13 19:43

    mAdapter.getItems() 은 어떻게 정의되어 있나요?

    Adapter Class 전체를 보여주실 수 없나요..?
    제가 작성한 거랑 많이 달라서 너무 궁금하네요.

    좋은 정보 잘 봤습니다. ^^