Android.support.v4.view.ViewPager
View refresh
ViewPager의 View Refresh에 대한 순서 정리.
- PagerAdapter 에 대한
notifyDataSetChanged()
는 오직 ViewPager에게 DataSet이 변경되었다는 사실만 알려준다. 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 할 수 있다.
- PagerAdapter의
getItemPosition(Object)
를 Override하고 여기서POSITION_NONE
값을 반환 한다. 저 값은-2
로, 저 값이 들어가면 ViewPager는notifyDataSetChanged()
가 불릴 때마다 모든 View를 다시 그린다. 따라서 효율성이 떨어지긴 하지만 어쨌든 해결은 된다. 권장할만한 방법은 아니다. -
setTag()
를 통해 Fragment에 Tag를 설정하고, PagerAdapter의instantiateItem(View, position)
을 Override하여 Tag값 기준으로 필요한 View만 다시 생성한다. 이 방법을 이용하면notifyDataSetChanged()
를 부르지 않고,ViewPager.findViewWithTag(Object)
를 통해서 Update 를 시도해야 한다.
Disable viewpager
ViewPager의 Paging을 Enable/Disable 하는 방법은 아래와 같이 ViewPager 클래스를 상속받아, onTouchEvent()
와 onInterceptTouchEvent()
를 Override 해야 한다.
public class CustomViewPager extends ViewPager {
private boolean isPagingEnabled;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.isPagingEnabled = true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.isPagingEnabled) {
return super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (this.isPagingEnabled) {
return super.onInterceptTouchEvent(event);
}
return false;
}
public void setPagingEnabled(boolean b) {
this.isPagingEnabled = b;
}
}
See also
- android.support.v4.view.PagerAdapter
Favorite site
- Android Developer: ViewPager (extends ViewGroup)
- Multiple-View ViewPager Options 1
- Android - Can View Pager have multiple views in per page?
- [추천] devunwired/PagerActivity.java
- SampleVIewPager 소스 파일 분석하기
References
-
Android_multiple_view-viewpager_options.pdf ↩