关于ViewPager的view复用主要了解Adapter中各个函数的执行过程。
instantiateItem()方法: 滑动到一个新的item时被调用。
destroyItem(): 当用户滑到第3个item的时候被调用。先调用这个方法来回收第一个item,然后调用instantiateItem()方法来实例化第3个item。
所以,可以在destroyItem()的时候将要被remove掉的view回收起来,然后在instantiateItme()的时候重复利用这个view。这样,就只会有3个ViewHolder实例存在:当前显示的、上一个、下一个
代码:
class MyViewPagerAdapter extends PagerAdapter {
private LinkedList<View> mViewCache = null;
public MyViewPagerAdapter() {
mViewCache = new LinkedList<>();
}
@Override
public int getCount() {
return 10;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
holder = null;
View convertView = null;
if (mViewCache.size() == 0) {
convertView = View.inflate(ExperimentActivity.this, R.layout.item_exper_viewpager, null);
holder = new ViewHolder();
holder.ivPic = (ImageView) convertView.findViewById(R.id.iv_title_pic);
holder.ivBg = (ImageView) convertView.findViewById(R.id.iv_bg_pic);
holder.tvName = (TextView) convertView.findViewById(R.id.tv_exper_name);
holder.tvNum = (TextView) convertView.findViewById(R.id.tv_num);
holder.vLine = convertView.findViewById(R.id.v_line);
convertView.setTag(holder);
} else {
convertView = mViewCache.removeFirst();
holder = (ViewHolder) convertView.getTag();
}
holder.tvName.setText("string");
holder.tvNum.setText("string");
container.addView(convertView);
return convertView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
mViewCache.add((View) object);
}
//View复用
public final class ViewHolder {
public TextView tvName;
public TextView tvNum;
public ImageView ivPic;
public ImageView ivBg;
public View vLine;
}
}
自己结合网上看到的理解,有问题欢迎提出。