需要ViewPager托管非fragment視圖時锭亏,就需要實現(xiàn)原生PagerAdapter接口诉瓦,比如托管圖片
要實現(xiàn)PagerAdapter接口姐呐,則需要了解ViewPager-PagerAdapter和RecyclerView-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)
方法一:創(chuàng)建指定位置的列表項視圖廉涕,然后將其添加給ViewGroup視圖容器。并不要求立即創(chuàng)建視圖艇拍,PagerAdapter可自行決定何時創(chuàng)建視圖
方法二:銷毀已建視圖
方法三:判斷pager的一個view是否和instantiateItem返回的object匹配
貼一下網上搜到的答案網址:https://segmentfault.com/q/1010000000484617
前提概念:
ViewPager里面對每個頁面的管理是key-value形式的狐蜕,也就是說每個page都有個對應的id(id是object類型),需要對page操作的時候都是通過id來完成的
首先看這個函數(shù)
public Object instantiateItem(ViewGroup container, int position)卸夕;
這是pageAdapter里的函數(shù)层释,功能就是往PageView里添加自己需要的page。同時注意它還有個返回值object快集,這就是那個id贡羔。
最后
public abstract boolean isViewFromObject (View view, Object object)
這個函數(shù)就是用來告訴框架,這個view的id是不是這個object个初。
谷歌官方推薦把view當id用乖寒,所以常規(guī)的instantiateItem()函數(shù)的返回值是你自己定義的view,而isViewFromObject()的返回值是view == object勃黍。
ps:感覺這個機制應該是歷史遺留問題宵统,屬于改bug改出來的機制。否則官方不會推薦這種把view當id的做法
用ViewPager來實現(xiàn)應用的引導頁
//初始化引導頁數(shù)據(jù)
//本例中引導頁有四張圖片
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);
}
//初始化引導頁布局
//用四個ImageView來裝這四張圖片
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)聽事件實現(xiàn)滑動最后一頁一定距離時跳轉到登錄頁
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();
//獲取屏幕長度
WindowManager windowManager=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
Point size=new Point();
windowManager.getDefaultDisplay().getSize(size);
int width=size.x;
//首先確定是否到了最后一頁覆获,在判斷滑動距離是否符合
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();
}
//判斷當前分頁是不是view马澈,因為ViewPager的分頁可以填入Fragment
@Override
public boolean isViewFromObject(View view,Object object)
{
return view==object;
}
//清理內存,釋放滑過的頁的內存
@Override
public void destroyItem(ViewGroup container,int position,Object object)
{
container.removeView(mImageViews.get(position));
}
//初始化分頁
@Override
public Object instantiateItem(ViewGroup container,int position)
{
ImageView imageView=mImageViews.get(position);
imageView.setImageResource(mImageIds.get(position));
container.addView(imageView);
return imageView;
}
}