原理就是当总个数大于1时,getCount返回一个最大值Integer.MAX_VALUE,然后循环展示对应的图片
基于ViewPager原理,缓存3个视图用于展示 ,并设置起始的位置。
public static class LoopPagerAdapter extends PagerAdapter {
public static class ViewHolder {
View v;
ImageView iv;
TextView tv;
public void recycle() {
v = null;
iv = null;
tv = null;
}
}
Context context;
List<String> urls;
//最多保存3个ViewHolder用于显示
SparseArray<ViewHolder> viewHolders = new SparseArray<ViewHolder>();
public LoopPagerAdapter(Context context, List<String> urls) {
this.context = context;
this.urls = urls;
}
@Override
public int getCount() {
int realCount = getRealCount();
return realCount <= 1 ? realCount : Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
//实际的个数
private int getRealCount() {
return null == urls ? 0 : urls.size();
}
//相对于原始的索引
private int getRealPosition(int position) {
return position % urls.size();
}
//ViweHolder的索引,最多缓存3个
private int getViewIndex(int position) {
return position % 3;
}
//第一个item
private int getFirstItem() {
int realCount = getRealCount();
return realCount <= 1 ? 0 : (Integer.MAX_VALUE / 2 / realCount * realCount);
}
//相对于原始的数组的第n个item
private int getItemOffset(int index) {
return getFirstItem() + index;
}
private ViewHolder createViewHolder() {
LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.VERTICAL);
ImageView iv = new ImageView(ll.getContext());
TextView tv = new TextView(ll.getContext());
tv.setTextSize(25);
tv.setMinHeight(100);
tv.setGravity(Gravity.CENTER);
ll.addView(iv, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1));
ll.addView(tv);
ViewHolder vh = new ViewHolder();
vh.v = ll;
vh.iv = iv;
vh.tv = tv;
return vh;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
int realPosition = getRealPosition(position);
int viewIndex = getViewIndex(position);
ViewHolder vh = viewHolders.get(viewIndex);
if (null == vh) {
vh = createViewHolder();
viewHolders.put(viewIndex, vh);
} else if (vh.v.getParent() != null) {
((ViewGroup)vh.v.getParent()).removeView(vh.v);
}
vh.tv.setText("Item : " +realPosition + " / " + getRealCount() );
Picasso.with(context).load(urls.get(realPosition)).into(vh.iv);
container.addView(vh.v);
return vh.v;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
}
public void recycle() {
context = null;
urls = null;
for (int i = 0; i < viewHolders.size(); i++) {
viewHolders.get(i).recycle();
}
viewHolders.clear();
viewHolders = null;
}
}
使用时需要设置一个初始位置:
viewPager.setCurrentItem(adapter.getFirstItem());