在寫輪播發(fā)現(xiàn)一個(gè)問題,往左滑動(dòng)會(huì)出現(xiàn)IllegalStateException。告訴你只能有一個(gè)父親。三思下,注銷掉了destroyItem的通常寫法在instantiateItem里addview之前判斷下if(container.equals(view.getParent())) {
container.removeView(view);
},之后還注意到,@Override
public intgetItemPosition(Object object) {
returnPOSITION_NONE;
}。這兩個(gè)方法一寫,基本就解決了 一些問題,可是后來同事在寫自動(dòng)輪播的時(shí)候會(huì)出現(xiàn)空白頁,打印后發(fā)現(xiàn),從別的頁面切換回來竟然會(huì)輪播線程執(zhí)行兩次,細(xì)想可能是輪播寫的有點(diǎn)問題,就簡(jiǎn)單封裝了一下。
public classMaxImagerViewPagerextendsViewPager {
private booleanisstart=false;
private longtime=2000;
privateListlist=newArrayList<>();
privateTimetasktimetask;
publicMaxImagerViewPager(Context context) {
this(context, null);
}
publicMaxImagerViewPager(Context context,AttributeSet attrs) {
super(context,attrs);
init();
}
private voidinit() {
timetask=newTimetask(this);
}
/**
*按下停止輪播, 如果離開的時(shí)間>= 2000毫秒,那么ViewPager繼續(xù)輪播
*/
public voidstartlop() {
if(!isstart) {
isstart=true;
postDelayed(timetask,time);
}
}
public voidstoplop() {
isstart=false;
removeCallbacks(timetask);
}
@Override
protected voidonDetachedFromWindow() {
super.onDetachedFromWindow();
stoplop();
}
@Override
protected voidonAttachedToWindow() {
super.onAttachedToWindow();
startlop();
}
public static classTimetaskimplementsRunnable {
privateWeakReferenceweakReference;
publicTimetask(MaxImagerViewPager maxImagerViewPager) {
weakReference=newWeakReference(maxImagerViewPager);
}
@Override
public voidrun() {
MaxImagerViewPager maxImagerViewPager =weakReference.get();
maxImagerViewPager.setCurrentItem(maxImagerViewPager.getCurrentItem() +1
);
maxImagerViewPager.postDelayed(maxImagerViewPager.timetask,maxImagerViewPager.time);
}
}
@Override
protected voidonVisibilityChanged(View changedView, intvisibility) {
super.onVisibilityChanged(changedView,visibility);
if(VISIBLE== visibility) {
startlop();
}else if(INVISIBLE== visibility) {
stoplop();
}
}
@Override
public booleanonTouchEvent(MotionEvent ev) {
switch(ev.getAction()) {
caseMotionEvent.ACTION_DOWN:
//按下停止
stoplop();
break;
caseMotionEvent.ACTION_UP:
startlop();
break;
}
return super.onTouchEvent(ev);
}
private booleantimetag=false;
//監(jiān)測(cè)兩次時(shí)間的間隔
//提供方法設(shè)置viewpager的適配器
public voidsetMaXadapter(List list,Context context) {
this.list= list;
setAdapter(newMyadapter(context));
setCurrentItem(200);
}
public classMyadapterextendsPagerAdapter {
privateContextcontext;
publicMyadapter(Context context) {
this.context= context;
}
@Override
public intgetCount() {
returnInteger.MAX_VALUE;
}
@Override
public booleanisViewFromObject(View view,Object object) {
returnview == object;
}
@Override
publicObjectinstantiateItem(ViewGroup container, final intposition) {
final inti = position %list.size();
View view =list.get(i);
view.setOnClickListener(newOnClickListener() {
@Override
public voidonClick(View v) {
Toast.makeText(context,i+"",Toast.LENGTH_SHORT).show();
}
});
if(container.equals(view.getParent())) {
container.removeView(view);
}
Log.d("TAG","instantiateItem: ");
container.addView(view);
returnview;
}
@Override
public intgetItemPosition(Object object) {
returnPOSITION_NONE;
}
@Override
public voiddestroyItem(ViewGroup container, intposition,Object object) {
//? ? ? ? ? ? container.removeView(list.get(position % list.size()));
}
@Override
public voiddestroyItem(View container, intposition,Object object) {
//? ? ? ? ? ? super.destroyItem(container, position, object);
}
}
}