安卓用线程怎么实现viewpager自动切换

安卓用线程怎么实现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();
部分数据,根据需求修改