这几天用ViewPager做安卓广告轮播图,发现一个问题,如果广告数据量大于等于4,那么广告就能正常循环播放;如果广告数量小于等于3就会出现移除view失败;我花了一个下午时间找到了问题所在,原来PagerAdapter里面的
instantiateItem方法和destroyItem方法的position是存在3个长度差异,这就是pageradapter的缓存空间,如果数据量<=3那么你的软件很容易出现崩溃,我按照以上原理对代码进行了小小修改,只要源数据长度<=3,我就把数据进行拷贝备份一份一模一样的数据,那就使源数据长度大于等于4了,可是你不能让用户体验出2个相同广告,那你就要用源数据长度对position修改。好了不扯淡了,不信你们可以试试,我上传源码。
希望能帮助到一些朋友少走弯路//以下是Java源码import android.content.Context; import android.graphics.Bitmap; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.example.asus.ncyz.R; import java.util.ArrayList; import java.util.List; public class AdvertiseView extends RelativeLayout { protected static final String TAG = "AdvertiseView"; private ViewPager mViewPager; private List<ImageView> mListData; private int mLastSelectedPositon = 0; private ArrayList<Bitmap> mImages; private ArrayList<String> mTitles; private int real_size=0; /* 这个传送数据的接口 */ public void setImagesAndTitles(ArrayList<Bitmap> images, ArrayList<String> titles) { //这个是广告轮播图的图片链表 mImages = images; //这是广告轮播图的描述信息链表 mTitles = titles; mDotsContainer = (LinearLayout) findViewById(R.id.dots_container); // ListView -> setAdapter -> create Adapter -> List data initDataList(); mViewPager.setAdapter(new MyPagerAdapter()); mViewPager.setOnPageChangeListener(mOnPageChangeListener); int initPosition = Integer.MAX_VALUE / 2; initPosition = initPosition - initPosition % mImages.size(); mTitle.setText(mTitles.get(0)); mViewPager.setCurrentItem(initPosition); } public AdvertiseView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { LayoutInflater.from(getContext()).inflate(R.layout.view_advertise, this); mViewPager = (ViewPager) findViewById(R.id.view_pager); mTitle = (TextView) findViewById(R.id.title); } private OnPageChangeListener mOnPageChangeListener = new OnPageChangeListener() { @Override public void onPageSelected(int position) { roll(position); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { } }; private TextView mTitle; private LinearLayout mDotsContainer; private void initDataList() { mListData = new ArrayList<ImageView>(); real_size=mImages.size(); for (int i = 0; i < mImages.size(); i++) { ImageView imageView = new ImageView(getContext()); mListData.add(imageView); View view = new View(getContext()); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(24, 24); if (i != mImages.size()-1) { layoutParams.rightMargin = 16; } layoutParams.topMargin = 12; view.setLayoutParams(layoutParams); if (i == 0) { view.setBackgroundResource(R.drawable.dot_selected); } else { view.setBackgroundResource(R.drawable.dot_normal); } mDotsContainer.addView(view); } if(mImages.size()==3){ ImageView imageView = new ImageView(getContext()); mListData.add(imageView); imageView = new ImageView(getContext()); mListData.add(imageView); imageView = new ImageView(getContext()); mListData.add(imageView); mImages.add(mImages.get(0)); mImages.add(mImages.get(1)); mImages.add(mImages.get(2)); } if(mImages.size()==2){ ImageView imageView = new ImageView(getContext()); mListData.add(imageView); imageView = new ImageView(getContext()); mListData.add(imageView); mImages.add(mImages.get(0)); mImages.add(mImages.get(1)); } } private class MyPagerAdapter extends PagerAdapter { @Override public int getCount() { if(mImages.size()==1){ return 1; } return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { position = position % mImages.size(); ImageView imageView = mListData.get(position); //设置广告轮播图的图片 imageView.setImageBitmap(mImages.get(position)); imageView.setScaleType(ScaleType.FIT_XY); container.addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { position = position % mImages.size(); ImageView imageView = mListData.get(position); container.removeView(imageView); } } private void roll(int position){ position = position % real_size; mTitle.setText(mTitles.get(position)); View previousDot = mDotsContainer.getChildAt(mLastSelectedPositon); previousDot.setBackgroundResource(R.drawable.dot_normal); View dot = mDotsContainer.getChildAt(position); dot.setBackgroundResource(R.drawable.dot_selected); mLastSelectedPositon = position; } /* *这个是用于自动滚动图片接口 */ public void autoscroll(){ mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1); } }
//以下是xml配置文件<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" > </android.support.v4.view.ViewPager> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:layout_alignParentBottom="true" android:background="#33000000" android:orientation="vertical" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:paddingTop="8dp" android:text="标题" android:textColor="@android:color/white" /> <LinearLayout android:id="@+id/dots_container" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="horizontal" > </LinearLayout> </LinearLayout> </merge>