需要ViewPager托管非fragment視圖時(shí),就需要實(shí)現(xiàn)原生PagerAdapter接口,比如托管圖片
要實(shí)現(xiàn)PagerAdapter接口,則需要了解ViewPager-PagerAdapter和RecyclerView-Adapter各自關(guān)系的異同
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)
方法一:創(chuàng)建指定位置的列表項(xiàng)視圖,然后將其添加給ViewGroup視圖容器。并不要求立即創(chuàng)建視圖,PagerAdapter可自行決定何時(shí)創(chuàng)建視圖
方法二:銷毀已建視圖
方法三:判斷pager的一個(gè)view是否和instantiateItem返回的object匹配
貼一下網(wǎng)上搜到的答案網(wǎng)址:https://segmentfault.com/q/1010000000484617
前提概念:
ViewPager里面對(duì)每個(gè)頁(yè)面的管理是key-value形式的,也就是說(shuō)每個(gè)page都有個(gè)對(duì)應(yīng)的id(id是object類型),需要對(duì)page操作的時(shí)候都是通過(guò)id來(lái)完成的
首先看這個(gè)函數(shù)
public Object instantiateItem(ViewGroup container, int position);
這是pageAdapter里的函數(shù),功能就是往PageView里添加自己需要的page。同時(shí)注意它還有個(gè)返回值object,這就是那個(gè)id。
最后
public abstract boolean isViewFromObject (View view, Object object)
這個(gè)函數(shù)就是用來(lái)告訴框架,這個(gè)view的id是不是這個(gè)object。
谷歌官方推薦把view當(dāng)id用,所以常規(guī)的instantiateItem()函數(shù)的返回值是你自己定義的view,而isViewFromObject()的返回值是view == object。
ps:感覺(jué)這個(gè)機(jī)制應(yīng)該是歷史遺留問(wèn)題,屬于改bug改出來(lái)的機(jī)制。否則官方不會(huì)推薦這種把view當(dāng)id的做法
用ViewPager來(lái)實(shí)現(xiàn)應(yīng)用的引導(dǎo)頁(yè)
//初始化引導(dǎo)頁(yè)數(shù)據(jù)
//本例中引導(dǎo)頁(yè)有四張圖片
private void initGuideDate()
{
mImageIds=new ArrayList<>();
mImageIds.add(R.drawable.guide_1);
mImageIds.add(R.drawable.guide_2);
mImageIds.add(R.drawable.guide_3);
mImageIds.add(R.drawable.guide_4);
}
//初始化引導(dǎo)頁(yè)布局
//用四個(gè)ImageView來(lái)裝這四張圖片
private void initGuideView()
{
mImageViews=new ArrayList<>();
for(int i=0;i<mImageIds.size();++i)
{
ImageView imageView=new ImageView(this);
mImageViews.add(imageView);
}
}
//初始化ViewPager
//并且為其添加監(jiān)聽(tīng)事件實(shí)現(xiàn)滑動(dòng)最后一頁(yè)一定距離時(shí)跳轉(zhuǎn)到登錄頁(yè)
private void initViewPager()
{
mViewPager=(ViewPager)findViewById(R.id.view_pager);
mViewPager.setAdapter(new GuideAdapter());
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
currentItem=position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
mViewPager.setOnTouchListener(new View.OnTouchListener() {
float startX;
float startY;
float endX;
float endY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
startX=event.getX();
startY=event.getY();
break;
case MotionEvent.ACTION_UP:
endX=event.getX();
endY=event.getY();
//獲取屏幕長(zhǎng)度
WindowManager windowManager=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
Point size=new Point();
windowManager.getDefaultDisplay().getSize(size);
int width=size.x;
//首先確定是否到了最后一頁(yè),在判斷滑動(dòng)距離是否符合
if((currentItem==(mImageIds.size()-1))&&(startX-endX>0)&&(startX-endX>(width/4)))
{
Intent intent=LoginActivity.newIntent(GuideActivity.this);
startActivity(intent);
finish();
}
break;
}
return false;
}
});
}
private class GuideAdapter extends PagerAdapter
{
@Override
public int getCount()
{
return mImageViews.size();
}
//判斷當(dāng)前分頁(yè)是不是view,因?yàn)閂iewPager的分頁(yè)可以填入Fragment
@Override
public boolean isViewFromObject(View view,Object object)
{
return view==object;
}
//清理內(nèi)存,釋放滑過(guò)的頁(yè)的內(nèi)存
@Override
public void destroyItem(ViewGroup container,int position,Object object)
{
container.removeView(mImageViews.get(position));
}
//初始化分頁(yè)
@Override
public Object instantiateItem(ViewGroup container,int position)
{
ImageView imageView=mImageViews.get(position);
imageView.setImageResource(mImageIds.get(position));
container.addView(imageView);
return imageView;
}
}