假设:我们要实现一个无限子页的ViewPager , 按照ListView convertView原理我们知道 必须要复用之前已经创建好的View 而不是每次新显示都去创建一个新的!
个人随便写了一个,用来找找思路! 写的不对还希望大家指正探讨!
public class ArticleAdapter extends PagerAdapter {
List<Article> list;
private ViewPager pager;
LayoutInflater inflater = null;
//用于存储回收掉的View
private List<WeakReference<LinearLayout>> viewList;
Context context;
public ArticleAdapter(Context context, List<Article> list) {
this.list = list;
this.context = context;
viewList = new ArrayList<WeakReference<LinearLayout>>();
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object instantiateItem(View container, int position) { // 这个方法用来实例化页卡
LogUtils.i(getClass(), "execute instantiateItem position:" + position);
if (pager == null) {
pager = (ViewPager) container;
}
View view = null;
// 从废弃的里去取 取到则使用 取不到则创建
if (viewList.size() > 0) {
if (viewList.get(0) != null) {
view = initView(viewList.get(0).get(), position);
viewList.remove(0);
}
}
view = initView(null, position);
pager.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
LogUtils.i(getClass(), "execute destroyItem position:" + position);
//存储离屏的View 等待复用
LinearLayout view = (LinearLayout) object;
container.removeView(view);
viewList.add(new WeakReference<LinearLayout>(view));
LogUtils.i(getClass(), "viewList size:" + viewList.size());
}
private View initView(LinearLayout view, int position) {
ViewHolder viewHolder = null;
if (view == null) {
view = (LinearLayout) inflater.inflate(R.layout.article_item, null);
viewHolder = new ViewHolder();
viewHolder.title_TV = (TextView) view
.findViewById(R.id.article_title_tv);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
/**
* 初始化数据
*/
if (list != null && position < list.size()) {
Article article = list.get(position);
viewHolder.title_TV.setText(article.getTitle());
}
return view;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
private class ViewHolder {
TextView title_TV;
}
}