ViewPager中View的复用

代码例如以下:

public class MyViewPagerAdapter extends PagerAdapter {

    //显示的数据
    private List<DataBean> datas = null;

    private LinkedList<View> mViewCache = null;

    private Context mContext ;

    private LayoutInflater mLayoutInflater = null;

    public MyViewPagerAdapter(List<DataBean> datas, Context context) {
        super();
        this.datas = datas;
        this.mContext = context ;
        this.mLayoutInflater = LayoutInflater.from(mContext) ;
        this.mViewCache = new LinkedList<>();
    }

    @Override
    public int getCount() {
        Log.e("test","getCount ");
        return this.datas.size();
    }

    @Override
    public int getItemPosition(Object object) {
        Log.e("test","getItemPosition ");
        return super.getItemPosition(object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Log.e("test","instantiateItem " + position);
        ViewHolder viewHolder = null;
        View convertView = null;
        if(mViewCache.size() == 0){
            convertView = this.mLayoutInflater.inflate(R.layout.viewadapter_item_layout ,
                    null ,false);
            TextView textView = (TextView)convertView.findViewById(R.id.view_pager_item_textview);
            viewHolder = new ViewHolder();
            viewHolder.textView = textView;
            convertView.setTag(viewHolder);
        }else {
            convertView = mViewCache.removeFirst();
            viewHolder = (ViewHolder)convertView.getTag();
        }

        viewHolder.textView.setText(datas.get(position).title);
        viewHolder.textView.setTextColor(Color.YELLOW);
        viewHolder.textView.setBackgroundColor(Color.GRAY);

        container.addView(convertView ,ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT );

        return convertView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        Log.e("test","destroyItem " + position);
        View contentView = (View) object;
        container.removeView(contentView);
        this.mViewCache.add(contentView);
    }

    @Override
    public boolean isViewFromObject(View view, Object o) {
        Log.e("test","isViewFromObject ");
        return view == o;
    }

    public final class ViewHolder{
        public TextView textView ;
    }
}

首先须要了解ViewPager的Adapter各个方法的回调机制。

这里主要看两个方法:instantiateItem()和destroyItem()。

instantiateItem()方法,是在滑动到一个新的ViewItem的时候被调用的,而destroyItem()是在当用户滑到第3个ViewItem的时候被调用,在这个时候会先调用这种方法来回收第一个ViewItem,然后在调用instantiateItem()方法来实例化第3个ViewItem。能够在adapter的各个回调方法中打出log来看这种方法被调用的时机。

利用上面所说的机制,就能够在destroyItem()的时候将要被remove掉的view回收起来,然后在instantiateItme()的时候反复利用这个view。这样,就仅仅会有3个ViewHolder实例存在。即当前显示的。还有上一个Item和下一个Item。

时间: 2024-11-08 18:29:29

ViewPager中View的复用的相关文章

android ViewPager之PagerAdapter中View的重用

在写PagerAdapter的时候,需要重写instantiateItem(ViewGroup  container ,int position) 此方法中,将需要加载的View,添加到container中. PagerAdapter不能直接使用像ListView那样的ViewHolder,来实现View的复用. 所以,如果每次加载,都要新建一个View出来就会很占用内存. 如果你的View都是一样的,比如都是ImageView,那么就可以使用一个List将回收的View存起来 再次加载的时候,

【原创】【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

ViewPager中切换界面Fragment被销毁的问题分析 1.使用场景 ViewPager+Fragment实现界面切换,界面数量>=3 2.Fragment生命周期以及与Activity生命周期对比                    3.问题描述 按上图所说,只有当Fragment所Attached的Activity执行destroy的时候才会调用onDestoryView方法,然而现实是: 当界面由2切换到1的时候,3界面对应的Fragment实际上走了如下流程: 1 -->onP

转载【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

ViewPager中切换界面Fragment被销毁的问题分析 原文链接 http://www.cnblogs.com/monodin/p/3866441.html 1.使用场景 ViewPager+Fragment实现界面切换,界面数量>=3 2.Fragment生命周期以及与Activity生命周期对比                    3.问题描述 按上图所说,只有当Fragment所Attached的Activity执行destroy的时候才会调用onDestoryView方法,然而现

Android借助Handler,实现ViewPager中页面的自动切换(转)

在很多电商网页及app上都有自动切换的商品的推广快,感觉体验挺不错的,正好今天学习使用ViewPager,因此也实现了一个功能类似的demo. 下面是其中的两个截图:           实现一个自动播放功能的ViewPager,要做的主要有以下的几个部分: 实现一个ViewPagerAdapter,用于为ViewPager提供展示内容(例如上面的两张小猫图片) public class ViewPagerAdapter extends PagerAdapter { private List<V

安卓ViewPager中Button点击事件弹出Dialog

首先页面采用ViewPager,在第一个页面中有一个按钮,要求点击这个页面上的按钮弹出一个对话框. 先贴出效果图: 分析难点:1.在ViewPager中,共有四个选项卡页,找到第一个页面中Button按钮.先贴出代码: 1 package com.example.acountrecorder; 2 import java.util.ArrayList; 3 import java.util.HashMap; 4 import java.util.List; 5 import com.exampl

Aandroid在ViewPager中添加ListView

最近的项目中碰到一个需要横竖都能滑动的页面效果,如同手机qq的好友菜单界面(如下图),可以通过选项卡来选择需要的界面,也可以通过屏幕手指的滑动来实现,而每一个分页面的内容对应的是一个可以上下滑动的ListView,所以最后结合起来的效果是,在页面中可以上下滑动,在各个分页之间可以左右滑动. 对于这个效果有两种方案,一种是通过TabActivitiy来实现,将选项卡设置为TabActibitiy的标志,通过将需要的分页加载到Tab的各个标志中去,但是这种方法,由于每一次切换选项卡的时候都会重新去创

向 ViewPager 中添加 包含 ListView 的 Fragment

对与fragment就不说什么了,直接看API手册吧,亲. 向 ViewPager 中添加 包含 ListView 的 Fragment 的过程比较麻烦.他所表现的效果就是新闻客户端的滑动翻页效果. 在这里就不粘代码了.只把思路理一下.代码有时间再粘: 一,你需要一个 ViewPager :在实验时,我的activity中就只有一个ViewPager.没有别的东西. 二,你需要一个自定义的fragment,在我们这里的话,这种fragment中有一个listView就可以了(布局文件中只有一个L

解决在viewpager中使用scrollerView导致的焦点的问题

horizontalScrollView.setOnTouchListener(new View.OnTouchListener() { float rawX; int mTouchSlop = ViewConfiguration.get(getActivity()).getScaledTouchSlop(); @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getActionMasked()

android ViewPager中页面延迟加载的实现

对于viewpager的使用,如果说是请求的数据对内存的消耗不到的话,这是很理想的,但是如果说请求的数据对内存消耗的比较大的话这样就容易出现oom(比如说图片),在使用viewPager的时候使用setOffscreenPageLimit(int size)默认的是1,所以说我们怎么设置这个值,在加载数据的话会将当前页面和下个页面的数据同时的进行请求,这在某种情况下时非常的影响性能的,还有就是在当前页面和下个页面在viewPager中算作了同一个页面,因为你是无法通过生命周期来进行控制数据的延迟