1. 程式人生 > >ViewPager中View的複用

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。

相關推薦

TabLayout+ViewPagerFragment 為什麼只出來一條資料?

思路:              首先這個介面有兩種甚至三種方式是可以實現的,下面讓我來為大家講講我的思路,希望大家不要覺得我太廢話了,嘿嘿,其實我在現實生活中就是一個,外向,陽光,積極向上喜歡說話交好朋友的女孩,興趣愛好更是數不勝數,但是做了敲程式碼的奴隸後我就很少有時間

ViewPagerView

程式碼如下: public class MyViewPagerAdapter extends PagerAdapter { //顯示的資料 private List<DataBean> datas = null; private Li

vue重新整理當前路由:router-view 元件時不重新整理的3種解決方案總結

vue-router是Vue.js官方的路由外掛,它和vue.js是深度整合的,適合用於構建單頁面應用。vue的單頁面應用是基於路由和元件的,路由用於設定訪問路徑,並將路徑和元件對映起來。傳統的頁面應用,是用一些超連結來實現頁面切換和跳轉的。在vue-router單頁面應用中,則是路徑之間的切換,也

MVPPresenter的思考

MVP模式早已經不是什麼新鮮詞了,這裡不再贅述。最近在重構程式碼的過程中,發現了一件及其痛苦的事情:很多時候,model層在應用中是很薄的,大多數的業務邏輯都在Presenter層,但是由於模版 程式碼,Activity(View)->P是一一對應繫結的關

python開發過程總結

爬蟲在開發過程中也有很多複用的過程,這裡總結一下,以後也能省些事情。1、基本抓取網頁get方法post方法2、使用代理IP在開發爬蟲過程中經常會遇到IP被封掉的情況,這時就需要用到代理IP;在urllib2包中有ProxyHandler類,通過此類可以設定代理訪問網頁。3、C

ListView中子view機制的實現原理以及圖片錯位的解決方案

ConvertView複用原理圖:藉助於RecycleBin(回收站)實現複用; RecycleBin的作用:對子View進行回收利用。 移出螢幕的ImageView控制元件會進入到RecycleBin當中,而新進入螢幕的元素則會從RecycleBin中獲取ImageVi

viewpager佈局FragmentPagerAdapter的坑,原始碼分析,控制元件id的一些思考

一個fragment的佈局複用,裡面是tablayout+viewpager,viewpager載入不同adapter,adapter繼承FragmentPageAdapter。執行後有問題,先初始化的fragment正常顯示,後加載的fragment裡的vie

OSI物理層通訊方式的總結之通道技術

[百科上這樣描述]“複用”是一種將若干個彼此獨立的訊號,合併為一個可在同一通道上同時傳輸的複合訊號的方法。 比如,傳輸的語音訊號的頻譜一般在300~3400Hz內,為了使若干個這種訊號能在同一通道上傳輸,可以把它們的頻譜調製到不同的頻段,合併在一起而不致相互影響,並能在接收端彼此分離

mac ffmpeg 的錄製命令和分解與命令

mac中螢幕錄製命令: ffmpeg -f avfoundation -i 1 -r 30 out.yuv -f 指定使用 avfoundation 採集資料。 -i 指定從哪兒採集資料,它是一個檔案索引號。在我的MAC上,1代表桌面。 -r 指定幀率。按ffmpeg官方文

多路IO模型的select和epoll

多路複用IO模型中的select和epoll 一,前提知識——檔案描述符fd 1、檔案描述符簡介 首先從檔案描述符開始講起。因為,對於核心而言,所有開啟的檔案都是通過檔案描述符引用的。那麼檔案描述符到底是什麼? 檔案描述符(file descriptor)通常是一個小的非負整

vue-router關於元件頁面不重新整理的問題

業務描述: 當前頁面是一個帶引數的頁面,如下: 頁面下方有tab,點選其一個的跳轉路由是: 由此,發現問題,地址改變了,但是頁面資料沒有重新整理。 查閱後,此情況屬於元件複用的情況。 解決方法: 通過watch監聽路由變化: watch: { '

在vue封裝可的元件

本次封裝的元件以toast元件為例 以前使用移動端ui外掛時,通過一句程式碼比如 $.toast( ‘ 需要顯示的內容 ’ ),從而在頁面上展示這段文字,並在一定時間後消失。 現在我們也嘗試自己封裝toast元件。 準備工作:vue-cli腳手架工程 先看一下涉及到的檔案目錄截圖:

php類的繼承與程式碼

/** * 類的繼承 * 1. 繼承是為了程式碼複用 * 2. php只支援單繼承 * 3. 父類也叫超類,基類,子類也叫派生類 */   //宣告一個父類 class ParentClass{ public $name; protected $cour

波分OADM在本地網的應用

城域波分和長途波分由於應用場合不同和需求不同導致在結構上也有所差別。長途波分注重超長距離傳送和減少電中繼數量,大量採用全部波長上下的背靠背的OTM方式,雖然成本較高但是同昂貴的電中繼相比運營商容易接受其價格。但是本地網內一般距離都不會很長,在200~400

Kotlin封裝一個AndroidView的BackgroundDrawableBuilder

一個自定義的TextView,對background的設定進行了簡單封裝。同時包含了一個ShapeBuilder,可以用於設定給所有View新增背景 簡化View的background建立,支援在xml和程式碼中設定backgroundDrawable, 程式碼中支援鏈

網路程式設計I/Oselect的用法

網路程式設計select的用法 select使用流程圖 在網路程式設計中需要新增的程式碼行以及意義 例程 參考文獻及部落格 注:本文對select函式、相關引數及結構體不做解釋 select使用流程

angular modal模態框(可

可複用的 (普通的在function中找) : 點選事件之後的函式 $rootScope.confirm = function(content, okFn, cancelFn) { var

在io把監聽套接字設為非阻塞

  往往在select 或 epoll 中把 listen_socket 設定為非阻塞 O_NONBLOCK 原因是出在 accept 上, 比如有這麼一個客戶端 : RST客戶端 當這個select或epoll 的伺服器非常繁忙時, 有這麼一個一連線就斷開的客戶端,

Linux I/Oselect poll epoll模型的介紹及其優缺點的比較

關於I/O多路複用: I/O多路複用(又被稱為“事件驅動”),首先要理解的是,作業系統為你提供了一個功能,當你的某個socket可讀或者可寫的時候,它可以給你一個通知。這樣當配合非阻塞的socket使用時,只有當系統通知我哪個描述符可讀了,我才去執行read操