ONE Goal ,ONE Passion!
轮播图顾名思义就是能自动或手动切换的图片.一般都用于广告等.一般的实现可以用viewFilpper或viewPager.下面使用viewPager实现轮播图;
使用ViewFlipper实现:
http://blog.csdn.net/fengltxx/article/details/50344019
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>
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容器的当前位置.
好了简单的轮播图已经实现了.