ViewPager 순환 슬라이딩 실현
/**
* 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] 데 이 터 를 업데이트 할 수 있 습 니 다.헤헤.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.