首先来看看我的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/vp_carousel_picture"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<LinearLayout
android:id="@+id/ll_indicator"
android:gravity="center"
android:background="#66000000"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_alignParentBottom="true"
>
</LinearLayout>
</RelativeLayout>
然后在创建holder,把布局加载进去:
public class CarouselHolder extends BaseHolder<List<HomeHeaderModel.DataBean.AdvertListBean>>implements ViewPager.OnPageChangeListener {
private ViewPager vp_carousel_picture;
private List<HomeHeaderModel.DataBean.AdvertListBean> datas;
private View view;
boolean flag;
private AuToRunTask runTask;
private List<ImageView> mIndicator;
private LinearLayout ll_indicator;
/**
* 创建界面
*/
@Override
public View initView() {
view=View.inflate(Tools.getContext(),R.layout.carousel_picture,null);
vp_carousel_picture=(ViewPager)view.findViewById(R.id.vp_carousel_picture);
ll_indicator=(LinearLayout)view.findViewById(R.id.ll_indicator);
return view;
}
/**
* 根据数据刷新界面
*
* @param data
*/
@Override
public void refreshView(List<HomeHeaderModel.DataBean.AdvertListBean> data) {
datas = data;
initIndicator();
vp_carousel_picture.setAdapter(new CarouselAdapter());
setIndicator(0);
vp_carousel_picture.setCurrentItem(2000 * datas.size());// 设置起始的位置 Integer.Max_Vlue/2
vp_carousel_picture.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
runTask.stop();
break;
case MotionEvent.ACTION_CANCEL: // 事件的取消
case MotionEvent.ACTION_UP:
runTask.start();
break;
}
return false; // viewPager 触摸事件 返回值要是false
}
});
runTask = new AuToRunTask();
runTask.start();
vp_carousel_picture.setOnPageChangeListener(this);
}
/**
* 初始化小圆点
*/
private void initIndicator() {
mIndicator =new ArrayList<ImageView>();
for (int i=0;i<datas.size();i++){
ImageView img=new ImageView(Tools.getContext());
LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(Tools.getDimens(R.dimen.indicator_height),Tools.getDimens(R.dimen.indicator_height));
params.setMargins(10,0,0,0);
img.setLayoutParams(params);
img.setImageResource(R.drawable.shape_point_red);
ll_indicator.addView(img);
mIndicator.add(img);
}
}
private class CarouselAdapter extends PagerAdapter{
// 当前viewPager里面有多少个条目
LinkedList<SimpleDraweeView> convertView=new LinkedList<SimpleDraweeView>();
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
SimpleDraweeView view=(SimpleDraweeView) object;
convertView.add(view);// 把移除的对象 添加到缓存集合中
container.removeView(view);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
int index=position%datas.size();
SimpleDraweeView view;
if(convertView.size()>0){
view=convertView.remove(0);
}else{
view= new SimpleDraweeView(Tools.getContext());
}
FrescoTool.loadImage(view, Constants.ImageResource.BASE_AD_URL + datas.get(index).getPath());
container.addView(view); // 加载的view对象
return view; // 返回的对象
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
@Override
public void onPageSelected(int position) {setIndicator(position);}
@Override
public void onPageScrollStateChanged(int state) {}
/**
* 根据viewpager的position设置小圆点的位置
* @param position
*/
private void setIndicator(int position) {
position %= datas.size();
//遍历mIndicator重置src为normal
for (ImageView indicator : mIndicator){
indicator.setImageResource(R.drawable.shape_point_gray);
}
mIndicator.get(position).setImageResource(R.drawable.shape_point_red);
}
public class AuToRunTask implements Runnable{
@Override
public void run() {
if(flag){
Tools.cancel(this); // 取消之前
int currentItem = vp_carousel_picture.getCurrentItem();
currentItem++;
vp_carousel_picture.setCurrentItem(currentItem);
// 延迟执行当前的任务
Tools.postDelayed(this, 2000);// 递归调用
}
}
public void start(){
if(!flag){
Tools.cancel(this); // 取消之前
flag=true;
Tools.postDelayed(this, 2000);// 递归调用
}
}
public void stop(){
if(flag){
flag=false;
Tools.cancel(this);
}
}
}
}