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容器的当前位置.

效果图:
Android轮播图-----viewPager_第1张图片

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

你可能感兴趣的:(viewpager,广告)