知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
ViewPager使用方法詳解
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):157
今天我們來(lái)看看ViewPager,這個(gè)控件異常實(shí)用。閑話不說(shuō),直接進(jìn)入主題:
要構(gòu)造ViewPager,先說(shuō)幾點(diǎn)要留意一點(diǎn),ViewPager 是存在于Android的 v4 兼容包里:
[img]
android.jar 就是我們的最重要的sdk, android.support.v4.jar 就是android為了高版本sdk兼容低版本體系而創(chuàng)建的兼容包。 ViewPager就是一個(gè)控件,和TextView一個(gè)級(jí)別,其初始辦法要應(yīng)用到Adapter,我們天然愫想到了ListView。那么它與ListView最大年夜的不合就是其初始化時(shí)可以應(yīng)用3中Adapter:
(1)PagerAdapter :用于初始化view,
(2)FragmentPagerAdapter:用于初始化 Fragment,
(3)FragmentStatePagerAdapter:和FragmentPagerAdapter類似,然則供給加倍周全的創(chuàng)建和燒毀功能。
接下來(lái)我們來(lái)一一介紹,先貼一張效不雅圖:
[img]
1. 要應(yīng)用ViewPager,起首須要在構(gòu)造中惹人控件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.PagerTabStrip android:id="@+id/pagertabstrip" android:layout_width="match_parent" android:layout_height="wrap_content" > </android.support.v4.view.PagerTabStrip> </android.support.v4.view.ViewPager> </LinearLayout>ViewPager就是我們的控件, PagerTabStrip是title。
2. 惹人控件之后, 和listview一樣, 我們就須要對(duì)其添加數(shù)據(jù). 方才已經(jīng)介紹過(guò), 添加數(shù)據(jù)一共有3中Adapter,先來(lái)介紹最簡(jiǎn)單的一種PagerAdapter。
我們須要持續(xù)PagerAdapter,然后重寫瑯綾擎的辦法:
package com.xiaoming.demo01_viewpager; import java.util.List; import android.support.v4.view.PagerAdapter; import android.util.Log; import android.view.View; import android.view.ViewGroup; public class MyPagerAdapter extends PagerAdapter { private static final String TAG = "MyPagerAdapter"; private List<View> mViewList; private List<String> mTitleList; public MyPagerAdapter(List<View> viewlist, List<String> titlelist) { this.mViewList = viewlist; this.mTitleList = titlelist; } @Override public int getCount() { return mViewList.size(); } @Override public boolean isViewFromObject(View view, Object obj) { return view==obj; } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(mViewList.get(position)); Log.d(TAG,"instantiateItem,"+"position:"+position); return mViewList.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(mViewList.get(position)); Log.d(TAG,"destroyItem,"+"position:"+position); } @Override public CharSequence getPageTitle(int position) { return mTitleList.get(position); } }mViewList 是傳入要顯示的View列表,在MainActivity中的初始化為:
[img]
mTitleList 是傳入對(duì)應(yīng)每頁(yè)要顯示的title,在MainActivity中的初始化為:
[img]
這里須要重寫的幾個(gè)辦法也很簡(jiǎn)單:
(1)getCount() : 獲取總共頁(yè)數(shù)
(2)isViewFromObject(View view, Object obj):斷定view是否是指定的obj,直接參照官方api:return view==obj;
(3)instantiateItem(ViewGroup container, int position):用來(lái)初始化容器中的內(nèi)容:
先是添加到容器中:container.addView(mViewList.get(position));
然后返回顯示的view:return mViewList.get(position);
(4)destroyItem(ViewGroup container, int position, Object object):移除對(duì)象,并且燒毀不要的對(duì)象:
container.removeView(mViewList.get(position));
(5)getPageTitle(int position): 獲得對(duì)應(yīng)頁(yè)的標(biāo)題: return mTitleList.get(position);
5個(gè)辦法都很簡(jiǎn)單,重寫完之后我們就可以來(lái)加載ViewPager了:
mViewPager = (ViewPager) findViewById(R.id.viewpager); MyPagerAdapter myadapter = new MyPagerAdapter(viewlist, titlelist); mViewPager.setAdapter(myadapter);
如許就完成了。如不雅想監(jiān)聽viewpager變更時(shí)的時(shí)光,可以給MainActivity實(shí)現(xiàn) OnPageChangeListener, 然后重寫這三個(gè)辦法,我們這里用最簡(jiǎn)單的toast來(lái)提示:
@Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { showToast("當(dāng)前是第" + arg0 + "頁(yè)"); }
3. 介紹完了應(yīng)用PagerAdapter,我們來(lái)介紹應(yīng)用Fragment填充ViewPager內(nèi)容:
和應(yīng)用view一樣,起首須要初始化一個(gè)Fragment列表(至于fragment不在這里介紹):
[img]
然后寫一個(gè)adapter持續(xù)至 FragmentPagerAdapter:
package com.xiaoming.demo01_viewpager; import java.util.List; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; public class MyFragmentPageAdapter extends FragmentPagerAdapter { private List<Fragment> mListFragment; private List<String> mListTitle; public MyFragmentPageAdapter(FragmentManager fm, List<Fragment> listFragment, List<String> listTitle) { super(fm); this.mListFragment = listFragment; this.mListTitle = listTitle; } @Override public Fragment getItem(int position) { return mListFragment.get(position); } @Override public int getCount() { return mListFragment.size(); } @Override public CharSequence getPageTitle(int position) { return mListTitle.get(position); } }實(shí)現(xiàn)的辦法重要少了兩個(gè):instantiateItem() 和 destroyItem() ,因?yàn)樵趹?yīng)用fragment和ViewPager澆憂⒛時(shí)刻,第一次加載ViewPager,就會(huì)把所有的fragment都加載進(jìn)入,并且知道ViewPager燒毀時(shí)才會(huì)燒毀fragment列表中的fragment。 然則在應(yīng)用 pageradapter的時(shí)刻,一次體系加載3個(gè)view中內(nèi)存中,會(huì)動(dòng)態(tài)的創(chuàng)建和刪除大年夜于3個(gè)的部分。相面代碼中也有l(wèi)og,大年夜家可以參考看一下。
在MainActivity中應(yīng)用:
MyFragmentPageAdapter fadapter = new MyFragmentPageAdapter(getSupportFragmentManager(), fragmentlist, titlelist); mViewPager.setAdapter(fadapter);
這里須要留意,初始化 FragmentPageAdapter第一個(gè)參數(shù)是 FragmentManager,用來(lái)治理Fragmnet。獲得FragmentManager有兩種情況:
(1)如不雅應(yīng)用 import android.support.v4.app.Fragment; 就是v4包中的Fragment,須要應(yīng)用Activity 的 getSupportFragmentManager() 獲得FragmentManager。
(2)如不雅應(yīng)用 import android.app.Fragment; 就是正牌Fragmnet,兼容性沒(méi)有那么好,直接應(yīng)用Activity 的 getFragmentManager() 獲得FragmentManager。
4. 應(yīng)用 FragmentStatePagerAdapter 填充 :
package com.xiaoming.demo01_viewpager; import java.util.List; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.view.ViewGroup; public class MyFragmentStatePageAdapter extends FragmentStatePagerAdapter { private List<Fragment> mListFragment; private List<String> mListTitle; public MyFragmentStatePageAdapter(FragmentManager fm, List<Fragment> listFragment, List<String> listTitle) { super(fm); this.mListFragment = listFragment; this.mListTitle = listTitle; } @Override public Fragment getItem(int position) { return mListFragment.get(position); } @Override public int getCount() { return mListFragment.size(); } @Override public CharSequence getPageTitle(int position) { return mListTitle.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); } @Override public Object instantiateItem(ViewGroup arg0, int arg1) { return super.instantiateItem(arg0, arg1); } }應(yīng)用辦法和應(yīng)用FragmentPagerAdapter完全一樣,就是多重寫了兩個(gè)辦法,并且都是應(yīng)用的父類的實(shí)現(xiàn):
@Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); } @Override public Object instantiateItem(ViewGroup arg0, int arg1) { return super.instantiateItem(arg0, arg1); }所以FragmentStatePagerAdapter 比 FragmentPagerAdapter 多的功能就是可以動(dòng)態(tài)的治理顯示和燒毀fragment。
總結(jié)一下:
填充ViewPager的內(nèi)容一共有3中方法:
(1)應(yīng)用PagerAdapter,最簡(jiǎn)單,便利,和view結(jié)合??梢詣?dòng)態(tài)創(chuàng)建和燒毀ViewPager中頁(yè)的內(nèi)容。
(2)應(yīng)用FragmentPagerAdapter,應(yīng)用fragmnet作為Viewpager內(nèi)容,fragment的生命周期加倍可控,所以更推薦。然則不克不及動(dòng)態(tài)創(chuàng)建和燒毀ViewPager中頁(yè)的內(nèi)容。然則這也不見得不是功德哦!
(3)FragmentStatePagerAdapter 像是PagerAdapter和FragmentPagerAdapter的結(jié)合,及應(yīng)用fragment,又可以實(shí)現(xiàn)動(dòng)態(tài)加載內(nèi)容。
好了,停止??!
下面可貼上代碼:
http://download.csdn.net/detail/u013647382/8329741
相關(guān)案例查看更多
相關(guān)閱讀
- 南通小程序制作公司
- 云南做百度小程序的公司
- 網(wǎng)站建設(shè)公司哪家好
- 昆明網(wǎng)站開發(fā)
- asp網(wǎng)站
- 云南網(wǎng)頁(yè)制作
- 網(wǎng)站建設(shè)服務(wù)
- 小程序的開發(fā)公司
- 智慧農(nóng)貿(mào)市場(chǎng)
- 百度小程序開發(fā)
- web前端
- 安家微信小程序
- 云南網(wǎng)站開發(fā)
- 云南網(wǎng)站建設(shè)公司
- 網(wǎng)站建設(shè)報(bào)價(jià)
- 小程序被攻擊
- 網(wǎng)站制作哪家好
- 紅河小程序開發(fā)
- 汽車報(bào)廢回收
- 網(wǎng)站建設(shè)案例
- 云南做網(wǎng)站
- 排名
- 云南網(wǎng)站建設(shè)
- 云南網(wǎng)站建設(shè)首選公司
- 百度排名
- 開發(fā)框架
- 云南網(wǎng)站建設(shè)制作
- 退款
- 網(wǎng)站開發(fā)
- 云南網(wǎng)絡(luò)公司