关闭

ViewPager

标签: android
117人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27485次
    • 积分:1248
    • 等级:
    • 排名:千里之外
    • 原创:101篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论