Skip to content

Android.support.v4.view.ViewPager

View refresh

ViewPager의 View Refresh에 대한 순서 정리.

  1. PagerAdapter 에 대한 notifyDataSetChanged()는 오직 ViewPager에게 DataSet이 변경되었다는 사실만 알려준다. ViewPager는 View의 등록과 삭제를 getItemPosition(Object)getCount()를 통해 한다.
  2. 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)를 Override하고 여기서 POSITION_NONE값을 반환 한다. 저 값은 -2로, 저 값이 들어가면 ViewPager는 notifyDataSetChanged()가 불릴 때마다 모든 View를 다시 그린다. 따라서 효율성이 떨어지긴 하지만 어쨌든 해결은 된다. 권장할만한 방법은 아니다.
  2. 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

References


  1. Android_multiple_view-viewpager_options.pdf