ViewPager 순환 슬라이딩 실현

인터넷 에서 viewpager 를 본 후에 직접 봤 는데 효과 가 좋 습 니 다. 마찬가지 로 eoe 커 뮤 니 티 에 도 관련 글 이 많 습 니 다. 예 를 들 어http://www.eoeandroid.com/forum.php?mod=viewthread&tid=157771&page=21#pid1384160view pager 를 사용 할 때 안 드 로 이 드 - 슈퍼 포트 - v4. jar 이 가방 을 가 져 오 는 것 을 잊 지 말고 다운로드 할 수 있 습 니 다.그러나 사용 할 때 상기 에서 찾 은 viewpager 가 순환 미끄럼 을 실현 하지 못 한 다 는 것 을 알 게 되 었 습 니 다. 이것 은 사용자 체험 에 좋 지 않 을 수도 있 습 니 다. 그래서 자신 은 이 를 바탕 으로 다른 방법 을 찾기 시 작 했 습 니 다. 마지막 으로 다음 과 같은 해결 방법 을 발 견 했 습 니 다. MyPagerAdapter 를 수정 하 겠 습 니 다.
/**
  * ViewPager   
  */
public class MyPagerAdapter extends PagerAdapter {
  public List<View> views;
  Context context;
  int mCount;
  public MyPagerAdapter(Context context,List<View> views) {
   this.views = views;
   this.context=context;   
         mCount = views.size();
  }
  @Override
  public void destroyItem(View collection, int position, Object arg2) {
   if (position >= views.size()) {
    int newPosition = position%views.size();   
                position = newPosition;
//       ((ViewPager) collection).removeView(views.get(position));
   }
   if(position <0){
    position = -position;
//    ((ViewPager) collection).removeView(views.get(position));
   }
  }
  @Override
  public void finishUpdate(View arg0) {
  }
  @Override
  public int getCount() {
   return mCount+1;//  +1        
  }
  @Override
  public Object instantiateItem(View collection, int position) {
   if (position >= views.size()) {
    int newPosition = position%views.size();
               
                position = newPosition;
                mCount++;
   }
   if(position <0){
    position = -position;
    mCount--;
   }
   try {
    ((ViewPager) collection).addView(views.get(position), 0);
   } catch (Exception e) {
         }
   return views.get(position);
  }
  @Override
  public boolean isViewFromObject(View view, Object object) {
   return view == (object);
  }
  @Override
  public void restoreState(Parcelable arg0, ClassLoader arg1) {
  }
  @Override
  public Parcelable saveState() {
   return null;
  }
  @Override
  public void startUpdate(View arg0) {
  }
}
                           ,            
/**
  *       ,        
  */
public class MyOnPageChangeListener implements OnPageChangeListener {
  int one = offset * 2 + bmpW;//   1 ->   2    
  int two = one * 2;//   1 ->   3    
  @Override
  public void onPageSelected(int arg0) {
   Animation animation = null;
   if(arg0>2){
    arg0=arg0%3;
   }
   switch (arg0) {
   case 0:
    if (currIndex == 1) {
     animation = new TranslateAnimation(one, 0, 0, 0);
    } else if (currIndex == 2) {
     animation = new TranslateAnimation(two, 0, 0, 0);
    }
    break;
   case 1:
    if (currIndex == 0) {
     animation = new TranslateAnimation(offset, one, 0, 0);
    } else if (currIndex == 2) {
     animation = new TranslateAnimation(two, one, 0, 0);
    }
    break;
   case 2:
    if (currIndex == 0) {
     animation = new TranslateAnimation(offset, two, 0, 0);
    } else if (currIndex == 1) {
     animation = new TranslateAnimation(one, two, 0, 0);
    }
    break;
   }
   currIndex = arg0;
   animation.setFillAfter(true);// True:          
   animation.setDuration(300);
   cursor.startAnimation(animation);
  }
  @Override
  public void onPageScrolled(int arg0, float arg1, int arg2) {
  }
  @Override
  public void onPageScrollStateChanged(int arg0) {
  }
}

이렇게 되면 다른 곳 에 서 는 수정 이 필요 없 이 viewpager 의 순환 미끄럼 효 과 를 실현 할 수 있다.
스스로 다음 과 같은 것 을 계속 수정 한 결과 왼쪽으로 무한 순환 (무한 한 것 같 음) 을 실현 할 수 있다 는 것 을 알 게 되 었 습 니 다. 제 방법 은 다음 과 같은 몇 가지 방법 으로 다음 과 같은 변경 을 하면 됩 니 다.
마지막 으로 페이지 를 초기 화 할 때 mPager. setCurrentItem (3 * 100); /초기 페이지 를 설정 합 니 다. 0 이면 왼쪽으로 미 끄 러 질 수 없습니다.
이렇게 하면 비슷 한 무한 순환 을 이 룰 수 있다.
 
질문
ViewPager 의 Pager Adapter 는 데 이 터 를 업데이트 할 수 없습니다.        
프로젝트 를 할 때 gallery Adapter. notify DataSetChanged () 를 호출 하 더 라 도
하지만 ViewPager 는 원래 데 이 터 를 업데이트 하지 않 습 니 다.
 
나중에 stackoverflow 에서 방법 을 찾 았 습 니 다. 원문 링크:
http://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the-view
 
그래서 코드 를 수정 하 는 데 시간 이 좀 걸 렸 습 니 다.
@Override
                public void destroyItem(View collection, int position, Object arg2) {
                        //           
//                    ((ViewPager) collection).removeView(views.get(position%views.size()));
                }

                @Override
                public void finishUpdate(View arg0) {
                }

                @Override
                public int getCount() {
                        return Integer.MAX_VALUE;//            
                }

                @Override
                public Object instantiateItem(View collection, int position) {
                        try {
                                ((ViewPager) collection).addView(views.get(position%views.size()), 0);
                        } catch (Exception e) {
                        }
                        return views.get(position%views.size());
                }

주의: POSITIONNONE 는 PagerAdapter 의 내부 상수 입 니 다. 값 은 - 2 입 니 다. API 에 설명 되 어 있 습 니 다. int android. support. v4. view. PagerAdapter. POSITIONNONE = - 2 [0xfffffffe] 데 이 터 를 업데이트 할 수 있 습 니 다.헤헤.

좋은 웹페이지 즐겨찾기