这段时间找了很多资料, 经过实践, 终于完成了一个完美的无限滚动轮播图, 话不多说, 直接上代码
<RelativeLayout
android:id="@+id/rev_adlist"
android:layout_width="match_parent"
android:layout_height="110dp"
android:layout_marginBottom="15dp"
android:visibility="gone">
<android.support.v4.view.ViewPager
android:id="@+id/vp_adlist"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/lin_adpoint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="5dp"
android:layout_marginLeft="7dp"
android:orientation="horizontal" />
</RelativeLayout>
public AdAdapter(Context context, List<AdListResponse.ValueBean> valueBeen) {
mContext = context;
this.valueBeen = valueBeen;
LayoutInflater inflater = LayoutInflater.from(mContext);
views = new ArrayList<>();
if (valueBeen.size() == 0)
return;
if (valueBeen.size() == 1) {
View inflate = inflater.inflate(R.layout.item_recycle_vp, null);
views.add(inflate);
} else {
for (int i = 0; i < valueBeen.size() + 2; i++) {
View inflate = inflater.inflate(R.layout.item_recycle_vp, null);
views.add(inflate);
}
}
}
@Override
public int getCount() {
return valueBeen.size() > 1 ? valueBeen.size() + 2 : 1;
}
adapter重点就是这个 在初始化adapter的时候 多添加两个View, 同时判断了轮播图个数是否大于1 (1个的时候也就没必要了对吧)
for (int i = 0; i < valueBeen.size(); i++) {
ImageView imgPoint = (ImageView)
linAdpoint.addView(imgPoint);
}
((ImageView) linAdpoint.getChildAt(0)).setImageResource(R.mipmap.sel_point);
adAdapter = new AdAdapter(getContext(), valueBeen);
vpAdlist.setAdapter(adAdapter);
vpAdlist.setCurrentItem(1, false);
vpAdlist.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
for (int i = 0; i < valueBeen.size(); i++) {
((ImageView) linAdpoint.getChildAt(i)).setImageResource(R.mipmap.unsel_point);
}
if (position == 0) {
((ImageView) linAdpoint.getChildAt(valueBeen.size() - 1)).setImageResource(R.mipmap.sel_point);
} else if (position == valueBeen.size() + 1) {
((ImageView) linAdpoint.getChildAt(0)).setImageResource(R.mipmap.sel_point);
} else {
((ImageView) linAdpoint.getChildAt(position - 1)).setImageResource(R.mipmap.sel_point);
}
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == ViewPager.SCROLL_STATE_IDLE) {
handleSetCurrentItem(vpAdlist.getCurrentItem());
}
}
private void handleSetCurrentItem(int position) {
final int lastPosition = vpAdlist.getAdapter().getCount() - 1;
if (position == 0) {
vpAdlist.setCurrentItem(lastPosition == 0 ? 0 : lastPosition - 1, false);
} else if (position == lastPosition) {
vpAdlist.setCurrentItem(1, false);
}
}
});
vpAdlist.setOnTouchListener((v, event) -> {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (handler != null)
handler.removeCallbacksAndMessages(null);
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (handler != null)
handler.sendEmptyMessageDelayed(100, 3000);
break;
}
return false;
});
if (handler != null)
handler.sendEmptyMessageDelayed(100, 3000);
handler代码
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 100:
int count = adAdapter.getCount();
/**
* 解决自动翻页 动画问题
*/
if (count > 2) {
int position = vpAdlist.getCurrentItem();
final int lastPosition = vpAdlist.getAdapter().getCount() - 1;
if (position == 0) {
vpAdlist.setCurrentItem(1, false);
} else if (position == lastPosition) {
vpAdlist.setCurrentItem(2, false);
}else {
vpAdlist.setCurrentItem(position+1, true);
}
handler.sendEmptyMessageDelayed(100, 3000);
}
break;
}
}
};
代码分享到此结束, 重要部分都贴出来了, 看一下大概就明白了, 原理很简单: 在轮播图前边 加一个View 展示的是最后一张轮播图, 最后边加一个View 展示的是第一张轮播图, 在跳到头和尾这两个的时候 做相应的无动画跳转, ok 完美