安卓用线程怎么实现viewpager自动切换.
用handler机制。
需求:广告轮播图,自动循环播放
解决方式:viewpager不断切换item
代码如下:
public class SlideShowView extends FrameLayout implements OnPageChangeListener {
private ViewPager viewPager;
private AdvertisementAdapter adapter;
private ImageLoader imageLoader;
private DisplayImageOptions options;
private List imageViews;
private List dotViews;
private ScheduledExecutorService scheduledExecutorService; // 定时任务
private Context context;
private LinearLayout layout;
private SlideImageClickListener slideImageClickListener;
public SlideShowView(Context context, AttributeSet attrs ) {
super(context, attrs);
initView();
this.context = context;
}
public void setSlideImageClickListener(SlideImageClickListener slideImageClickListener){
this.slideImageClickListener = slideImageClickListener;
}
private void initView() {
LayoutInflater.from(getContext()).inflate(R.layout.slideshowview_item,
this, true);
viewPager = (ViewPager) findViewById(R.id.integral_advertisement);
layout = (LinearLayout) findViewById(R.id.integral_advertisement_layout);
imageViews = new ArrayList<ImageView>();
dotViews = new ArrayList<ImageView>();
}
public void initDate(List<Carousel> slideDate) {
imageLoader = ImageLoaderManager.getInstance().imageLoader;
options = ImageLoaderManager.getInstance().options;
addImageView(slideDate);
adapter = new AdvertisementAdapter();
viewPager.setAdapter(adapter);
viewPager.setOnPageChangeListener(this);
startSlide();
}
public void addImageView(List<Carousel> slideDate) {
for (int i=0;i<slideDate.size();++i) {
Carousel carousel =slideDate.get(i);
imageViews.add(getImageView(carousel));
ImageView imageView = getDotView();
if(i!=0){
imageView.setAlpha(0.5f);
}
dotViews.add(imageView);
layout.addView(imageView);
}
if (imageViews.size() < 4) {//viewpaget的item不满足大于4,会导致些问题
copyImageView(slideDate);
}
}
public void copyImageView(List<Carousel> slideDate) {
for (Carousel carousel : slideDate) {
imageViews.add(getImageView(carousel));
}
}
public ImageView getDotView() {
ImageView imageView = new ImageView(context);
android.widget.LinearLayout.LayoutParams layoutParams = new android.widget.LinearLayout.LayoutParams(
10, 10);
layoutParams.leftMargin = 4;
layoutParams.rightMargin = 4;
imageView.setLayoutParams(layoutParams);
imageView.setBackgroundResource(R.drawable.shape_slide_dot);
return imageView;
}
public ImageView getImageView(final Carousel carousel) {
ImageView iv = new ImageView(getContext());
iv.setScaleType(ScaleType.FIT_XY);
ImageViewAware imageAware = new ImageViewAware(iv, false);
String imageUrl = getImageUrl(carousel.imgurl);
imageLoader.displayImage(imageUrl, imageAware, options); // 显示加载的图片
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
slideImageClickListener.slideImageClick(carousel);
}
});
return iv;
}
public String getImageUrl(String s) {
String imageUrl;
if (s.startsWith("http")) {
imageUrl = s;
} else {
imageUrl =Interface_Url.IMAGE_URLSTART + s.trim();
}
return imageUrl;
}
public boolean isFirs = true;
public void startSlide() {
if ((!isFirs)||imageViews.size()==0) {
return;
}
if (scheduledExecutorService == null
|| scheduledExecutorService.isShutdown()) {
scheduledExecutorService = Executors
.newSingleThreadScheduledExecutor();
}
// 每5秒告诉ui线程切换一次图片显示
scheduledExecutorService.scheduleAtFixedRate(slideshow_runnble, 5, 5,
TimeUnit.SECONDS);
isFirs = false;
}
public void stopSlide() {
isFirs = true;
if (scheduledExecutorService != null
&& !scheduledExecutorService.isShutdown()) {
scheduledExecutorService.shutdown();
}
}
private int i = 0;
// 执行轮播图切换任务
private Runnable slideshow_runnble = new Runnable() {
@Override
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
synchronized (viewPager) {
handler.obtainMessage().sendToTarget();
}
}
};
private Handler handler = new Handler(new android.os.Handler.Callback() {
@Override
public boolean handleMessage(Message arg0) {
setCurrentPage();
return false;
}
});
public void setCurrentPage() {
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
}
public static final String TAG = SlideShowView.class.getSimpleName();
private class AdvertisementAdapter extends PagerAdapter {
@Override
public int getCount() {
return Integer.MAX_VALUE / 2;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView(imageViews.get(position
% imageViews.size()));
}
@Override
public Object instantiateItem(View container, final int position) {
ImageView imageView = imageViews.get(position % imageViews.size());
((ViewPager) container).addView(imageView);
return imageView;
}
}
public boolean isScroll = false;
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int position) {
int pageIndex = position % imageViews.size();
int index;
if (pageIndex >= dotViews.size()) {
index = pageIndex % dotViews.size();
} else {
index = pageIndex;
}
for (int i = 0; i < dotViews.size(); ++i) {
ImageView iv=(ImageView) layout.getChildAt(i);
if(iv!=null){
if(i ==index){
iv.setBackgroundResource(R.drawable.shape_slide_dot);
iv.setAlpha(1f);
}else{
iv.setBackgroundResource(R.drawable.shape_slide_dot);
iv.setAlpha(0.5f);
}
}
}
}
}
加载数据:slideShowView.initDate()
启动方式: slideShowView.startSlide();
停止方式:slideShowView.stopSlide();
部分数据,根据需求修改