Android轮播图-----viewPager

来源:互联网 发布:淘宝店铺消保怎么交 编辑:程序博客网 时间:2024/06/06 15:49

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

效果图:
这里写图片描述

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

0 1
原创粉丝点击