Android轮播图-----viewPager

Android轮播图—–viewPager

ONE Goal ,ONE Passion!


轮播图顾名思义就是能自动或手动切换的图片.一般都用于广告等.一般的实现可以用viewFilpper或viewPager.下面使用viewPager实现轮播图;
使用ViewFlipper实现:
http://blog.csdn.net/fengltxx/article/details/50344019

第1步: 在xml中使用viewPager

xml代码:
viewPager是v.4包中的控件,一定要完整写android.support.v4.view.ViewPager才可以

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.custom.activity.ViewPagerActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="180dp">

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


</RelativeLayout>

第2步: 在activity中代码中使用并处理


public class ViewPagerActivity extends Activity {


    ViewPager mViewPager;
    myViewPagerAdapter myAdapter;
    List<ImageView> imageViewList;   存放ImageView的集合
    int[] imageId = new int[]{R.drawable.h1, R.drawable.h2,
            R.drawable.h3, R.drawable.h4, R.drawable.h5, R.drawable.h6};
    boolean isloop = true;

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager);


        imageViewList = new ArrayList<>();
       //   为集合填充数据
        for (int i = 0; i < imageId.length; i++) {
            ImageView iv = new ImageView(this);
            iv.setImageResource(imageId[i]);
            imageViewList.add(iv);
        }


        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        myAdapter = new myViewPagerAdapter(imageViewList);
        mViewPager.setAdapter(myAdapter);

        mViewPager.setCurrentItem(500);  //从500开始

        /**
         *   为viewpager设置监听
         */
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {


            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });

        changeView();
    }

    public void changeView() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (isloop) {
                //休眠3秒,即 3s切换切换一次
                    SystemClock.sleep(3000);
                    handler.sendEmptyMessage(0);
                }
            }
        }).start();
    }


    private class myViewPagerAdapter extends PagerAdapter {

        private List<ImageView> mList;

        /**
         * 将存放图片的集合传递进来
         *
         * @param imageViewList
         */
        public myViewPagerAdapter(List<ImageView> imageViewList) {
            this.mList = imageViewList;
        }

        /**
         * 该方法将返回所包含的 Item总个数。为了实现一种循环滚动的效果,返回了基本整型的最大值,这样就会创建很多的Item,
         * 其实这并非是真正的无限循环。
         */
        @Override
        public int getCount() {

            return Integer.MAX_VALUE;

        }

        /**
         * 判断出去的view是否等于进来的view 如果为true直接复用
         * 一般写死   return view == object; 
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        /**
         * 创建view
         *
         * @param container
         * @param position
         * @return
         */
        @Override
        public Object instantiateItem(ViewGroup container, final int position) {

            container.addView(mList.get(position % mList.size()));

            mList.get(position % mList.size()).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    System.out.println("点击了" + position % mList.size());

                }
            });

            return mList.get(position % mList.size());
        }

        /**
         * 销毁预加载以外的view对象, 会把需要销毁的对象的索引位置传进来,就是position,
         * 因为mImageViewList,而position将会取到很大的值,
         * 所以使用取余数的方法来获取每一条数据项。
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {

            container.removeView(mList.get(position % mList.size()));
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        isloop = false;
    }
}

a. 使用viewPager就像listView一样我们要使用适配器来填充数据.
当我们自定义myViewPagerAdapter 去继承PagerAdapter时,我们根据提示仅仅会得到两个重写的方法:

 @Override
        public int getCount() {

            return Integer.MAX_VALUE;

        }

        /**
         * 判断出去的view是否等于进来的view 如果为true直接复用
         * 一般   return view == object; 写死
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

b.我们需要手动重写两个方法:而且我们需要重写构造方法以便传递数据

private List<ImageView> mList;

        /**
         * 将存放图片的集合传递进来
         *
         * @param imageViewList
         */
        public myViewPagerAdapter(List<ImageView> imageViewList) {
            this.mList = imageViewList;
        }


  /**
         * 创建view
         *
         * @param container
         * @param position
         * @return
         */
        @Override
        public Object instantiateItem(ViewGroup container, final int position) {

            container.addView(mList.get(position % mList.size()));


            mList.get(position % mList.size()).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    System.out.println("点击了" + position % mList.size());

                }
            });

            return mList.get(position % mList.size());
        }

        /**
         * 销毁预加载以外的view对象, 会把需要销毁的对象的索引位置传进来,就是position,
         * 因为mImageViewList,而position将会取到很大的值,
         * 所以使用取余数的方法来获取每一条数据项。
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {

            container.removeView(mList.get(position % mList.size()));
        }
    }

我们有时候想给图片增加点击事件.

只需要在instantiateItem方法中增加事件就行了

   @Override
        public Object instantiateItem(ViewGroup container, final int position) {

            container.addView(mList.get(position % mList.size()));

        //  为当前的item增加点击事件  
            mList.get(position % mList.size()).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    System.out.println("点击了" + position % mList.size());

//  一般情况下,当点击某个item时.如果详情页,我们会将此item的数据通过intent传递到另一个activity中.

                }
            });

            return mList.get(position % mList.size());
        }

特别要注意:

得到的是当前list数据集合中的   第item条 数据
position % mList.size()
而position 是viewpager容器的当前位置.

效果图:
这里写图片描述

好了简单的轮播图已经实现了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值