可复用View的PagerAdapter,RecyclePagerAdapter

来源:互联网 发布:软件测试管理方法 编辑:程序博客网 时间:2024/06/06 03:24

参考:http://mosthink.net/?p=210

import android.support.v4.view.PagerAdapter;import android.util.SparseArray;import android.view.View;import android.view.ViewGroup;import java.util.ArrayList;import java.util.List;/** * 命名跟ListView的Adapter留下的接口名一样。 * 内部实现是维护一个View池来保存被destroyItem销毁的View,在instantiateItem的时候先看池子里有没有闲置可用的View。 * 使用这个View池的代码如下: */public abstract class RecyclePagerAdapter extends PagerAdapter {    private SparseArray<View> mPageViews = new SparseArray<View>();    /**     * 获取view方法,子类实现这个方法来获取渲染View     *     * @param convertView 如果是null则没有可复用的View,如果非null则是可复用的View     * @param position     * @return     */    protected abstract View getView(View convertView, int position);    @Override    public Object instantiateItem(ViewGroup container, int position) {        // 获取复用的view给子类去用,没有可复用的view时为null        //pullViewFromPool()就是传给实现类的convertView        View view = getView(pullViewFromPool(), position);        // 记录该view以在destroyItem中能找到        mPageViews.put(position, view);        // 添加到view pager        container.addView(view);        return view;    }    @Override    public void destroyItem(ViewGroup container, int position, Object object) {        View view = mPageViews.get(position);        // 把要删除的view放到pool里以供复用        pushViewToPool(view);        // 从view pager中删除        container.removeView(view);    }    //View池的实现如下:    //View池数据结构    private List<View> mPageViewPool = new ArrayList<View>();    //从池子里拿View    private View pullViewFromPool() {        View view = null;        for (View v : mPageViewPool) {            view = v;            break;        }        if (view != null) {            mPageViewPool.remove(view);        }        return view;    }    //把View倒进池子    private void pushViewToPool(View view) {        if (!mPageViewPool.contains(view)) {            mPageViewPool.add(view);        }    }}
0 0