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
- Android ViewPager 轮播图
- Android轮播图-----viewPager
- Android Viewpager实现 轮播图
- Android 轮播图广告栏ViewPager
- android viewPager 轮播图
- android viewpager轮播图无限循环
- android ViewPager无限滚动、轮播图
- Android 自定义ViewPager 实现轮播图
- Android ViewPager
- Android ViewPager
- android ViewPager
- android-Viewpager
- android Viewpager
- android viewpager
- android Viewpager
- android viewpager
- Android ViewPager
- android ViewPager
- Pure Android
- Android集成一个新产品时,lunch的product name和device name注意事项
- linux系统iNode耗尽
- 知识点
- EqualsBuilder类的使用
- Android轮播图-----viewPager
- Gradle Plugin Samples 之Gradle Library Projects(四)
- Java多线程-工具篇-BlockingQueue
- getopt和getopt_long函数用法
- rqnoj 12 陶陶摘苹果
- java.lang.OutOfMemoryError: unable to create new native thread
- Android 工具类 判定有无网络 NetworkUtils
- Python基础——yield的使用与解释
- The entity name must immediately follow the ‘&’ in the entity reference