본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] ViewPager view refresh 에 대한 고찰.

by 돼지왕 왕돼지 2013. 7. 29.
반응형


 안드로이드, ViewPager view refresh 에 대한 고찰

 


[android] ViewPager view refresh 에 대한 고찰.


 PagerAdapter 에 대한 notifyDataSetChanged()는 오직 ViewPager 에게 data set 이 변경되었다는 사실만을 알려준다. ViewPager 는 view 의 등록과 삭제를 getItemPosition( Object ) 과 getCount() 를 통해 한다.

notifyDataSetChanged() 가 불리면 ViewPager 는 child view의 position 을 getItemPosition( Object ) 을 호출하여 알아본다. 만약 이 child view 가 POSITION_NONE 을 던지면 ViewPager 는 view 가 삭제되었음을 안다. 그리고 destroyItem( ViewGroup, int, Object )을 불러 이 view 를 제거한다. 


ViewPager 가 View 를 업데이트하지 않는 현상이 나타나면 다음과 같이 억지로 update 시킬 수 있다.


1. PagerAdapter의 getItemPosition( Object object ) 를 override 하고 여기서 POSITION_NONE 값을 return 한다. 저 값은 -2로, 저 값이 들어가면 ViewPager 는 notifyDataSetChanged() 가 불릴 때마다 모든 View 를 다시 그린다. 따라서 효율성이 떨어지긴 하지만 어쨌든 해결은 된다. 권장할만한 방법은 아니다.



2. setTag() 를 통해 Fragment 에 tag 를 매겨놓고, PagerAdapter 의 instantiateItem( View, position ) 을 override 하여 tag 값 기준으로 필요한 view 만 다시 생성한다. 이 방법을 이용하면 notifyDataSetChanged() 를 부르지 않고, ViewPager.findViewWithTag( Object ) 를 통해서 update 를 시도해야 한다.





3. 이런 방법도 있다.


SparseArray<View> views = new SparseArray<View>();


@Override

public Object instantiateItem(View container, int position) {

    View view = ... // build view here

    ((ViewPager) container).addView( view );

    views.put( position, view );

    return root;

}


@Override

public void destroyItem(View collection, int position, Object o) {

    View view = (View) o;

    ((ViewPager) collection).removeView(view);

    views.remove(position);

    view = null;

}


@Override

public void notifyDataSetChanged() {

    int key = 0;

    for(int i = 0; i < views.size(); i++) {

       key = views.keyAt(i);

       View view = views.get(key);

       ... // refresh view

    }

    super.notifyDataSetChanged();

}







반응형

댓글