上次写项目时遇到广告轮播图,使用viewpager实现左右滑动,并带有圆点,可以实现左右无限滑动,这里整理出来
了,希望大家多多指导,废话不多说了,有图有真相,先看看效果图吧!!!!
图片大家看过了吧,效果是不是很赞啊,下面介绍代码部分吧
(1)大家先来看看布局吧,布局很简单,也没有什么好介绍的,大家自己看吧
<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"
>
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<LinearLayout
android:id="@+id/viewGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/mengceng"
android:gravity="center"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
(2)这一部分大家可以看看activity啦,核心的部分我已经注释的很详细了,我相信只要是学习过安卓的,并且认真思考了,都不会有什么困难的
public class MainActivity extends Activity {
/**
* 将图片对应的imageView添加到listViews
*/
private List<View> listViews = new ArrayList<View>();
private MyViewPagerAdp viewpagerAdp;
/**
* ViewPager
*/
private ViewPager viewPager;
/**
* 发送handler时用的tag
*/
private static final int MSG_CHANGE_PHOTO = 1;
/** 图片自动切换时间 */
private static final int PHOTO_CHANGE_TIME = 2000;
/**
* 装点点的ImageView数组
*/
private ImageView[] tips;
/**
* 把点点加到viewgroup中
*/
private ViewGroup mGroup;
/**
* 是否发送过消息到handler
*/
private boolean isFirstSendMessage = false;
/**
* 用于装载图片的list
*/
private List<Integer> mList = new ArrayList<Integer>();
/**
* 实现图片自动变换的核心代码
*/
Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case MSG_CHANGE_PHOTO:
int index = viewPager.getCurrentItem();//获得当前viewpager显示图片的下标
viewPager.setCurrentItem(index + 1, true);//把viewpager图片设置成下一张
mHandler.sendEmptyMessageDelayed(MSG_CHANGE_PHOTO,
PHOTO_CHANGE_TIME);
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 把LinearLayout布局强制转化成ViewGroup,用于装载点点
mGroup = (ViewGroup) findViewById(R.id.viewGroup);
viewPager = (ViewPager) findViewById(R.id.viewPager);
// 向mList添加图片
mList.add(R.drawable.meinv1);
mList.add(R.drawable.meinv2);
mList.add(R.drawable.meinv3);
mList.add(R.drawable.meinv4);
mList.add(R.drawable.meinv5);
mList.add(R.drawable.meinv6);
// 清空listViews,主要在实际项目中的有刷新的时候用,防止图片重复
// listViews.clear();
// 创建imageView对象,并把其加入到listViews中
for (int i = 0; i < mList.size(); i++) {
ImageView iv = new ImageView(this);
iv.setScaleType(ScaleType.CENTER_CROP);
iv.setBackgroundResource(mList.get(i));
listViews.add(iv);
}
viewpagerAdp = new MyViewPagerAdp(listViews);
viewPager.setAdapter(viewpagerAdp);
// 设置viewpager显示的图片
viewPager.setCurrentItem(listViews.size());
// 清空mGroup,主要在实际项目中的有刷新的时候用,防止点点重复
// mGroup.removeAllViews();
// 创建点点的数组
tips = new ImageView[listViews.size()];
for (int i = 0; i < tips.length; i++) {// 创建点点的imageView的对象,并把其加入到点点数组中
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));//设置点点的大小
imageView.setPadding(15, 0, 0, 0);//设置点点的间距
tips[i] = imageView;
if (i == 0) {// 第一个设置成默认显示
tips[i].setImageResource(R.drawable.focused);
} else {
tips[i].setImageResource(R.drawable.normal);
}
// 将点点对象添加的mGroup中
mGroup.addView(imageView);
}
// 设置监听,主要是设置点点的背景
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
// 设置选中的tip的背景
setImageBackground(arg0 % listViews.size());
}
});
mHandler.sendEmptyMessageDelayed(MSG_CHANGE_PHOTO, PHOTO_CHANGE_TIME);
// 这个主要是用来判断是否是第一次发送数据到handler,如果是第一次,就发送数据,否则在这里不发送;
// 这个有效的解决啦,实际项目中刷新时,viewpager图片变换变快的问题,又刷新才会体现它的价值
if (!isFirstSendMessage) {
mHandler.sendEmptyMessageDelayed(MSG_CHANGE_PHOTO,
PHOTO_CHANGE_TIME);
}
isFirstSendMessage = true;
}
/**
* 设置选中的tip的背景
*
* @param selectItemsIndex
*/
private void setImageBackground(int selectItemsIndex) {
for (int i = 0; i < tips.length; i++) {
if (i == selectItemsIndex) {
tips[i].setImageResource(R.drawable.focused);
} else {
tips[i].setImageResource(R.drawable.normal);
}
}
}
}
(3)这个是adapter,其中有一点可能不太容易理解的地方,先看代码,待会我再解释
public class MyViewPagerAdp extends PagerAdapter {
public List<View> mListViews;
public MyViewPagerAdp(List<View> listViews) {
this.mListViews = listViews;
}
@Override
public void finishUpdate(View arg0) {
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Object instantiateItem(View arg0, final int arg1) {
/*if (((ViewPager) arg0).getChildCount() == mListViews.size()) {
((ViewPager) arg0).removeView(mListViews.get(arg1
% mListViews.size()));
}
if(mListViews.get(arg1 % mListViews.size()).getParent() == null){
((ViewPager) arg0).addView(mListViews.get(arg1 % mListViews.size()), 0);
}*/
//优化之后
if(mListViews.get(arg1 % mListViews.size()).getParent() == null&&((ViewPager) arg0).getChildCount() < mListViews.size()){
((ViewPager) arg0).addView(mListViews.get(arg1 % mListViews.size()), 0);
}
View view = mListViews.get(arg1 % mListViews.size());
//为viewpager中的图片设置监听
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//这里写监听响应的内容
}
});
return mListViews.get(arg1 % mListViews.size());
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == (arg1);
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
}
}
/*if (((ViewPager) arg0).getChildCount() == mListViews.size()) {
((ViewPager) arg0).removeView(mListViews.get(arg1
% mListViews.size()));
}
if(mListViews.get(arg1 % mListViews.size()).getParent() == null){
((ViewPager) arg0).addView(mListViews.get(arg1 % mListViews.size()), 0);
}*/
这一部分虽然是注释的,但是我还是想啰嗦一下,第一个if目的就是为了不断的清除掉自己的孩子,以防止孩子会重复,当然了,在整理代码的时候,我已经意识到这是没有必要的啦,如果是有两个if,还是很必要的;第二个if,就是判断mListView中的view是否已经添加到viewpager中啦,没有则继续添加;这里后来我也意识到了,有浪费,下面介绍优化后的代码
if(mListViews.get(arg1 % mListViews.size()).getParent() == null&&((ViewPager) arg0).getChildCount() < mListViews.size()){
((ViewPager) arg0).addView(mListViews.get(arg1 % mListViews.size()), 0);
}
这个只需判断
mListView中的view是否已经添加到viewpager中,以及viewpager中孩子的数量是否小于mLisetview中view的数量,是则添加mListView中的view到viewpager中,只需添加mListView.size()次就可以啦,而上一种只要这个界面运行,他就会一直执行removeView和addView