package com.android.adapter; import android.database.DataSetObserver; import android.support.v4.view.PagerAdapter; import android.util.Log; import android.view.View; import android.view.ViewGroup; import com.android.hintview.HintView; import com.android.hintview.RollPagerView; import java.util.ArrayList; /** * Created by Mr.Jude on 2016/1/9. */ public abstract class LoopPagerAdapter extends PagerAdapter { private RollPagerView mViewPager; public ArrayList<View> mViewList = new ArrayList<>(); private class LoopHintViewDelegate implements RollPagerView.HintViewDelegate{ @Override public void setCurrentPosition(int position, HintView hintView) { if (hintView!=null) hintView.setCurrent(position%getRealCount()); } @Override public void initView(int length, int gravity, HintView hintView) { if (hintView!=null) hintView.initView(getRealCount(),gravity); } } @Override public void notifyDataSetChanged() { mViewList.clear(); mViewPager.getViewPager().setAdapter(this); initPosition(true); super.notifyDataSetChanged(); } //一定要用这个回调,因为它只有第一次设置Adapter才会被回调。而除了这个时候去设置位置都是...ANR @Override public void registerDataSetObserver(DataSetObserver observer) { super.registerDataSetObserver(observer); initPosition(false); } private void initPosition(boolean isFast){ if (getCount() <= 1)return; int half = isFast?getRealCount()*3:Integer.MAX_VALUE/2; int start = half - half%getRealCount(); mViewPager.getViewPager().setCurrentItem(start,false); } public LoopPagerAdapter(RollPagerView viewPager){ this.mViewPager = viewPager; viewPager.setHintViewDelegate(new LoopHintViewDelegate()); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0==arg1; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public Object instantiateItem(ViewGroup container, int position) { int realPosition = position%getRealCount(); View itemView = findViewByPosition(container,realPosition); Log.i("fenghaitao", "instantiateItem = "+realPosition); container.addView(itemView); return itemView; } private View findViewByPosition(ViewGroup container, final int position){ for (View view : mViewList) { if (((int)view.getTag()) == position&&view.getParent()==null){ return view; } } View view = getView(container,position); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("fenghaitao", "instantiateItem uuuuuuuuuuuuuuuuuuuu= "+position); } }); view.setTag(position); mViewList.add(view); return view; } public abstract View getView(ViewGroup container, int position); @Deprecated @Override public final int getCount() { return getRealCount()<=1?getRealCount():Integer.MAX_VALUE; } protected abstract int getRealCount(); }