十年專注于品牌網站建設 十余年專注于網站建設_小程序開發_APP開發,低調、敢創新、有情懷!
      南昌百恒網絡微信公眾號 掃一掃關注
      小程序
      tel-icon全國服務熱線:400-680-9298,0791-88117053
      掃一掃關注百恒網絡微信公眾號
      掃一掃打開百恒網絡微信小程序

      百恒網絡

      南昌百恒網絡

      淺談Android開發之ViewPager的工作原理

      百恒網絡 2017-07-14 6529

      在南昌APP開發中,ViewPager 和PagerAdapter類在后臺為我們完成了很多工作。那么ViewPager是如何工作的呢?在為大家介紹ViewPager的工作原理前,我們需要知道的是:大多情況下,我們無需了解其內部實現細節。不過,如果要自己實現PagerAdapter接口,那就要了解ViewPager-PagerAdapter和Recycler-View-Adapter各自關系的異同了。

      那么什么時候需要自己實現PagerAdapter接口呢?如果需要ViewPager托管非fragment視圖時,那就需要實現原生PagerAdapter接口。例如,在ViewPager中托管圖片這樣的常見視圖對象時。

      說到這里,相信大家又有疑問了,為什么選擇使用ViewPager而不是RecyclerView呢?別急,南昌APP制作開發公司小編這就來告訴大家:

      那是因為由于無法使用現有的Fragment,在CriminalIntent應用中使用RecyclerView需處理大量內部實現工作。Adapter需要我們及時地提供View。然而,決定fragment視圖何時創建的是FragmentManager。因此,當RecyclerView要求Adapter提供fragment視圖時,我們無法立即創建fragment并提供其視圖。

      這就是ViewPager存在的原因。它使用的是PagerAdapter類,而非原來的Adapter。PagerAdapter要比Adapter復雜得多,因為它要處理更多的視圖管理工作。以下為它的基本內部實現。

      PagerAdapter不使用可返回視圖的onBindViewHolder(...)方法,而是使用下列方法:

      public Object instantiateItem(ViewGroup container, int position)

      public void destroyItem(ViewGroup container, int position, Object object)

      public abstract boolean isViewFromObject(View view, Object object)

      PagerAdapter.instantiateItem(ViewGroup, int)方法告訴pager adapter創建指定位置的列表項視圖,然后將其添加給ViewGroup視圖容器,而destroyItem(ViewGroup, int,Object)方法則告訴pager adapter銷毀已建視圖。注意,instantiateItem(ViewGroup, int)方法并不要求立即創建視圖。因此,PagerAdapter可自行決定何時創建視圖。

      視圖創建完成后,ViewPager會在某個時間點注意到它。為確定該視圖所屬的對象,ViewPager會調用isViewFromObject(View, Object) 方法。這里, Object 參數是instantiateItem(ViewGroup,int)方法返回的對象。因此,假設ViewPager調用instantiateItem(ViewGroup, 5)方法返回一個A對象,那么只要傳入的View參數是第5個對象的視圖,isViewFromObject(View, A)方法就應返回true值,否則返回false值。

      對ViewPager來說,這是一個復雜的過程,但對于PagerAdapter來說,這算不上什么。因為PagerAdapter只要能夠創建、銷毀視圖以及識別視圖來自哪個對象即可。這樣的要求顯然很寬松,因而PagerAdapter能夠比較自由地通過instantiateItem(ViewGroup, int)方法創建并添加新的fragment,然后返回可以跟蹤管理的Object(fragment)。以下為isViewFromObject(View, Object)方法的具體實現:

      @Override

      public boolean isViewFromObject(View view, Object object) {

      return ((Fragment)object).getView() == view;

      }

      可以看到,每次需要使用ViewPager時,都要覆蓋實現PagerAdapter的這些方法,這真是一種磨難。幸好我們有FragmentPagerAdapter和FragmentStatePagerAdapter便利類,以至于我們不會那么麻煩!

      以上便是南昌APP開發公司小編為大家介紹的關于APP開發中ViewPager 的工作原理,如果想進一步了解這方面的知識的朋友,歡迎大家繼續關注百恒網絡官網動態,我們將定期為您更新技術文章。如有需要APP開發、網站建設等方面的服務,可隨時來電和我們聯系,本公司隨時為您效勞。


      400-680-9298,0791-88117053
      掃一掃關注百恒網絡微信公眾號
      掃一掃打開百恒網絡小程序

      歡迎您的光顧,我們將竭誠為您服務×

      售前咨詢 售前咨詢
       
      售前咨詢 售前咨詢
       
      售前咨詢 售前咨詢
       
      售前咨詢 售前咨詢
       
      售前咨詢 售前咨詢
       
      售后服務 售后服務
       
      售后服務 售后服務
       
      備案專線 備案專線
       
      ×
      99偷拍视频精品一区二区| 久久亚洲精品无码VA大香大香| 日韩精品专区在线影院重磅| 日韩在线视精品在亚洲| 国产精品电影一区| 亚洲熟妇无码久久精品| 色欲国产麻豆一精品一AV一免费| 亚洲精品无码专区在线在线播放 | 亚洲国产精品综合久久网各 | 亚洲精品9999久久久久无码| 精品人妻av区乱码| 久久99精品久久只有精品| 亚洲国产精品国自产拍电影| 国产精品免费无遮挡无码永久视频| 自拍偷在线精品自拍偷无码专区| 国产精品夜色视频一级区 | 国产乱码精品一区二区三区中文 | 国内精品久久国产大陆| 国产在线无码精品电影网| 久久精品国产一区二区三区不卡| 国产vA免费精品高清在线观看| 青草午夜精品视频在线观看| 日韩a级片在线观看| 日韩美女在线观看一区| 日韩av无码国产精品| 亚洲av日韩精品久久久久久a| 亚洲av日韩av无码黑人| 亚洲日韩激情无码一区| 日韩AV无码一区二区三区不卡毛片| 国产亚洲精品精品精品| 国产a不卡片精品免费观看| 国产a不卡片精品免费观看 | 久久国产成人精品麻豆| 国产乱码精品一区二区三区中文| 国内精品51视频在线观看| 国产亚洲精品xxx| 精品国产品香蕉在线观看75 | 国产精品99久久免费观看| 亚洲国产精品乱码一区二区| 久久精品国产2020观看福利| 久久99九九99九九精品|