안드로이드, 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();
}
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Java] Locale Based Date Format Sample Code. (0) | 2013.07.31 |
---|---|
[android] setRetainInstance( boolean ) 뭐하는 녀석이냐? (0) | 2013.07.29 |
[android] Viewpager with fragment problem. (4) | 2013.07.25 |
[android] Opensource Libraries 모음 (2) | 2013.07.25 |
[android] Service 함수 onStartCommand return 값의 의미. (0) | 2013.07.25 |
댓글