需要ViewPager托管非fragment视图时,就需要实现原生PagerAdapter接口,比如托管图片
要实现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)
方法一:创建指定位置的列表项视图,然后将其添加给ViewGroup视图容器。并不要求立即创建视图,PagerAdapter可自行决定何时创建视图
方法二:销毁已建视图
方法三:判断pager的一个view是否和instantiateItem返回的object匹配
贴一下网上搜到的答案网址:https://segmentfault.com/q/1010000000484617
前提概念:
ViewPager里面对每个页面的管理是key-value形式的,也就是说每个page都有个对应的id(id是object类型),需要对page操作的时候都是通过id来完成的
首先看这个函数
public Object instantiateItem(ViewGroup container, int position);
这是pageAdapter里的函数,功能就是往PageView里添加自己需要的page。同时注意它还有个返回值object,这就是那个id。
最后
public abstract boolean isViewFromObject (View view, Object object)
这个函数就是用来告诉框架,这个view的id是不是这个object。
谷歌官方推荐把view当id用,所以常规的instantiateItem()函数的返回值是你自己定义的view,而isViewFromObject()的返回值是view == object。
ps:感觉这个机制应该是历史遗留问题,属于改bug改出来的机制。否则官方不会推荐这种把view当id的做法
用ViewPager来实现应用的引导页
//初始化引导页数据
//本例中引导页有四张图片
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
//并且为其添加监听事件实现滑动最后一页一定距离时跳转到登录页
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;
}
}