关闭

ViewPager

标签: android
160人阅读 评论(0) 收藏 举报
分类:

Viewpager3.0出现的,用于大图轮播;

ViewPager预加载机制:最多保存3个page,超过的将需要被销毁掉

关联jar包的源代码:共两种方式;
1.先点击Android Dependencies,将它从BuildPath remove掉,
再右键点击jar包,将jar add to BuildPath;
然后就出现Attatch Source按钮了
2.在libs目录下新建一个文件,文件名是jar包全名(包括后缀.jar),然后
该文件名以.properties结尾,新建一行键值对如:
src=jar源代码绝对路径,(不要忘了将单斜线变成双斜线)

自定义View要带上包名:

在layout布局下定义view时。
    <android.support.v4.view.ViewPager>

    </android.support.v4.view.ViewPager>

ViewPager 需要 instantiateItem 相当于添加ListView中的getView;

public Object instantiateItem(ViewGroup container, int position) {
            // TODO Auto-generated method stub

            View view = View.inflate(MainActivity.this,R.layout.adapter_item, null);
            ImageView imageview  =(ImageView) view.findViewById(R.id.image);

            Ad ad = list.get(position);

            imageview.setImageResource(ad.getIconResId());

            container.addView(view);  //记得要将View添加到ViewPager中。


            return view;  //需要返回view;

        }

异常处理:
类明明存在,却报class not found异常解决方法
右键工程,打开bulid path面板,选择Order And Export,
将对应jar打钩

设置对应文字同步的方法是:设置页面改变的监听。

这个是文字改变时, 获取当前的页面与此匹配。  该方法要在页面改变监听中调用。
    private void updateDesc(){

        int currentpage = viewpager.getCurrentItem();
        tv_desc.setText(list.get(currentpage).getDesc());    //获取当前页面。

    }
    viewpager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override//页面改变的监听。
            public void onPageSelected(int position) {
                // TODO Auto-generated method stub
//              Log.e("Mainactivity", "position :"+position);
                updateDesc();
            }

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                // TODO Auto-generated method stub

            }
        });

动态的设置图片在pageVIew中:

这个方法是更新文字描述和原点的状态 。: 
private void updateDescAndDot() {

        int currentpage = viewpager.getCurrentItem();
        tv_desc.setText(list.get(currentpage).getDesc()); // 获取当前页面。
        for(int i=0; i<ll_dot.getChildCount();i++){
            ll_dot.getChildAt(i).setEnabled(currentpage==i);  //判断两者是否相同,相同的话为true。else为false。

        }

几个原点用代码在linearLayout的注册方式:

private void initDots() {
        // TODO Auto-generated method stub
        for (int i = 0; i < list.size(); i++) {
            View view = new  View(this);
            LayoutParams  params = new LayoutParams(8,8);  //这个是Linearlayout的layoutParams需注意必须是,
            if(i!=0){
                params.leftMargin=5;  //第一个不用设置左边距。
            }
            view.setLayoutParams(params);
            view.setBackgroundResource(R.drawable.selector_dot);

            ll_dot.addView(view);



        }

以下就是将ViewPager的轮播,变成无线循环的样式:
广告轮播的伪无限循环;

viewpager.setCurrentItem(item); viewPager中的方法。

    Ad ad = list.get(position%list.size());    //取得余数。
int currentValue = Integer.MAX_VALUE/2;
        int value = currentValue%list.size();
        viewpager.setCurrentItem(currentValue-value);     //保证两边都能无限的滑动。

adapter中的设置;

class MyAdapter extends PagerAdapter {

        /**
         * 获取page的总数量。
         */
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return Integer.MAX_VALUE; // list封装的数据个数。
        }

        /**
         * 滑动的view和即将进入的view是不是同一个 true : 使用缓存 false: 重新创建。
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            // TODO Auto-generated method stub
            return view == object;

        }

        /**
         * 删除销毁page; position 銷毀第几页。
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // TODO Auto-generated method stub
            // super.destroyItem(container, position, object);
            container.removeView((View) object);
        }

        /**
         * 类似于BaseAdapter的getView 方法。 将数据设置给View;
         * 
         */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            // TODO Auto-generated method stub

            View view = View.inflate(MainActivity.this, R.layout.adapter_item, null);
            ImageView imageview = (ImageView) view.findViewById(R.id.image);

            Ad ad = list.get(position%list.size());  //让它得到的值是其模数就能保证其能拿到具体的对象。

            imageview.setImageResource(ad.getIconResId());

            container.addView(view);

            return view;

        }

添加一个自动滑动的效果:
handler.sendEmptyMessageDelayed(0, 4000); 发送一个空的消息,用于延时。

加一个Handler就可以达到自动滑动的效果。
    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            viewpager.setCurrentItem(viewpager.getCurrentItem()+1);  //当前页面+1;

            handler.sendEmptyMessageDelayed(0, 4000);  //每四秒发送一个消息。  这个是为了达到循环的效果。


        };

    };
0
0
查看评论

ViewPager 系列之 打造一个通用的 ViewPager

背景 CommonViewPager.png ViewPager是Android开发者比较常用的一个控件了,由于它允许数据页从左到右或者从右到左翻页,因此这种交互也备受设计师的青睐。在APP中的很多场景都用得到,比如第一次安装APP时的用户引导页、图片浏览时左右翻页、广告Banner页等等都会用...
  • u012295927
  • u012295927
  • 2017-05-31 11:10
  • 539

解决ViewPager中嵌套ViewPager的滑动分发问题

本文主要解决ViewPager中嵌套ViewPager的滑动分发问题,自定义ViewPager,即BannerViewPager。 阻止子ViewPager中滑动事件不再分发给父ViewPager滑动。
  • langxm2006
  • langxm2006
  • 2016-11-12 23:54
  • 582

Android之viewPager嵌套viewPager无法滑动子viewPager

现在最头疼的事就是需求不明确,这不,有遇到你个奇葩需求,父viewPager总共有三个选项卡,第一个选项卡里嵌入一个子viewPager,这时候问题就来了,子viewPager无法滑动,我猜的事父viewPager把子viewPager拦截了,于是尝试了下面的第一种方法 1.重写父viewPage...
  • ElinaVampire
  • ElinaVampire
  • 2015-02-26 10:07
  • 2757

ViewPager相互嵌套,里层ViewPager无法滑动

ViewPager嵌套ViewPager,默认情况下,里层的ViewPager,是无法滑动的!
  • gaojinshan
  • gaojinshan
  • 2014-01-07 10:19
  • 26652

Android-ViewPager嵌套使用探究

终于不再是实习生,走出了穷逼的实习生生活,正式开始稍微不那么穷逼的正职员工生活,三天的启航培训还是挺欢乐的,学到一句话,保持饥渴,哈哈,感觉放到哪方面都说得通。回归正题:ViewPager的嵌套使用是一个很常见的问题,然而,最近又一次遇到ViewPager的嵌套使用问题。情景是这样的,需求上给出了这...
  • z82367825
  • z82367825
  • 2016-07-16 23:30
  • 4754

ViewPager延迟加载

一.ViewPager的pager中是ListView 今天遇到一个问题,就是如果ViewPager里的内容是从网上获取的,一下子把几个Pager页的内容都获取下来有点不太现实,而且用户不一定会翻到后面的pager页去看,所以需要每次只加载当前页。 我现在的做法是一开始传入的数据是空的,注意是空的...
  • dddd6666qq
  • dddd6666qq
  • 2014-12-24 14:24
  • 1151

Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

在Android中我们经常会用到ViewPager+Fragment组合。然而,有一个很让人头疼的问题就是,我们去加载数据的时候由于ViewPager的内部机制所限制,所以它会默认至少预加载一个。这让人很郁闷,所以,我就想到要封装一个Fragment来解决这个问题。 这里还解决一个问题就是在[And...
  • u010785585
  • u010785585
  • 2016-11-17 19:59
  • 19024

ViewPager设置 缓存个数、页卡间距、数据更新

在使用ViewPager常用设置 1)mViewPager.setOffscreenPageLimit(2);//设置缓存view 的个数(实际有3个,缓存2个+正在显示的1个) 2)mViewPager.setPageMargin((int)getResources().getDimensio...
  • jia4525036
  • jia4525036
  • 2014-02-08 11:37
  • 41586

ViewPager实现页卡的最新方法--简洁的TabLayout(谷歌支持包)

效果图:添加依赖包: compile 'com.android.support:design:22.2.0'布局文件:<?xml version="1.0" encoding="utf-8"?> <LinearLayou...
  • pengkv
  • pengkv
  • 2015-07-17 14:24
  • 27938

RecycleView和ViewPager冲突解决与原理

1.概述在实际开发中,我们经常遇到需要在ListView或RecycleView头部添加ViewPager实现Banner轮播效果,并需要添加下拉刷新,上拉加载功能。 但,横向滑动ViewPager时,稍微偏移就会失去焦点。2.解决方案我们知道事件拦截的顺序,父ViewGroup先接收到拦截,再传...
  • zhoutaochun
  • zhoutaochun
  • 2016-10-31 23:42
  • 3044
    个人资料
    • 访问:37260次
    • 积分:1372
    • 等级:
    • 排名:千里之外
    • 原创:103篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论