自定义轮播图加小圆点

布局文件引用


Activity调用
ViewPager bannerViewPager = view.findViewById(R.id.bannerViewPager); RecyclerView bannerRecycleView = view.findViewById(R.id.bannerRecycleView); List bannerList = new ArrayList<>(); new BannerView().setBanner(getActivity(), bannerViewPager, bannerRecycleView, bannerList,new BannerView.OnClickListener() { @Override public void cickPostion(int position) {} });

Banner管理器
package com.xinchengle.xiaokedou.utils.uiutils; import android.app.Activity; import android.content.Context; import android.os.Build; import android.os.Handler; import android.os.Message; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.Interpolator; import android.widget.LinearLayout; import android.widget.Scroller; import androidx.annotation.NonNull; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; import com.bumptech.glide.Glide; import com.xinchengle.xiaokedou.R; import java.lang.reflect.Field; import java.util.List; import java.util.Timer; import java.util.TimerTask; /** * Banner 轮播图 */public class BannerView {public interface OnClickListener { void cickPostion(int position); }private Context context; private List list; private OnClickListener onClickListener; private ViewPager viewPager; private final int BANNER_NEXT = 1; private Handler handler = new Handler() { @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); switch (msg.what) { case BANNER_NEXT: int currentItem = viewPager.getCurrentItem(); viewPager.setCurrentItem(currentItem + 1); sendMsg(); break; } } }; public void setBanner(Context context, ViewPager vp, RecyclerView recyclerView, List list, BannerView.OnClickListener onClickListener) { this.context = context; this.list = list; this.onClickListener = onClickListener; this.viewPager = vp; if (list.size() == 0) { return; }//设置展示View recyclerView.setLayoutManager(new LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)); MyDotAdapter myDotAdaoter = new MyDotAdapter(); recyclerView.setAdapter(myDotAdaoter); ViewPagerScroller pagerScroller = new ViewPagerScroller(context); pagerScroller.initViewPagerScroll(viewPager); MyViewPagerAdapter myViewPagerAdapter = new MyViewPagerAdapter(); viewPager.setAdapter(myViewPagerAdapter); //让viewpager的索引默认的指在200 viewPager.setCurrentItem(200); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Override public void onPageSelected(int position) { myDotAdaoter.setCheckPostion(position); myDotAdaoter.notifyDataSetChanged(); }@Override public void onPageScrollStateChanged(int state) {} }); //及时取消viewPager切换事件防止OOM viewPager.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) { case MotionEvent.ACTION_DOWN://按下 handler.removeMessages(BANNER_NEXT); case MotionEvent.ACTION_MOVE://移动 handler.removeMessages(BANNER_NEXT); case MotionEvent.ACTION_UP://抬起 handler.removeMessages(BANNER_NEXT); handler.sendEmptyMessageDelayed(BANNER_NEXT, 3000); } return false; } }); }//发送轮播请求 private void sendMsg() { handler.sendEmptyMessageDelayed(BANNER_NEXT, 3000); }//ViewPager适配器 private class MyViewPagerAdapter extends PagerAdapter {@Override public int getCount() { return Integer.MAX_VALUE; }@Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; }@Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View) object); }@NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) {View inflate = View.inflate(context, R.layout.item_banner_vp_view, null); RoundImageView imageView = inflate.findViewById(R.id.roundImage); if (!isDestroy((Activity) context)) { Glide.with(context).load(list.get(position % list.size())).into(imageView); } container.addView(inflate); inflate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(onClickListener!=null){ onClickListener.cickPostion(position % list.size()); } } }); return inflate; } }/** * 判断Activity是否Destroy */ private static boolean isDestroy(Activity mActivity) { if (mActivity == null || mActivity.isFinishing() || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && mActivity.isDestroyed())) { return true; } else { return false; } }//小圆点适配器 private class MyDotAdapter extends RecyclerView.Adapter {private int checkPostion; public void setCheckPostion(int checkPostion) { this.checkPostion = checkPostion; }@NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View inflate = View.inflate(context, R.layout.item_banner_recycle_view, null); return new ViewHolder(inflate); }@Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { if (position == (checkPostion % list.size())) { holder.bannerDot.setBackgroundResource(R.drawable.shape_banner_dot_check); } else { holder.bannerDot.setBackgroundResource(R.drawable.shape_banner_dot_false); } }@Override public int getItemCount() { return list.size(); }public class ViewHolder extends RecyclerView.ViewHolder {private final LinearLayout bannerDot; public ViewHolder(@NonNull View itemView) { super(itemView); bannerDot = itemView.findViewById(R.id.bannerDot); } } }//配置滑动速度 private class ViewPagerScroller extends Scroller {private int mScrollDuration = 800; public ViewPagerScroller(Context context) { super(context); }public ViewPagerScroller(Context context, Interpolator interpolator) { super(context, interpolator); }public ViewPagerScroller(Context context, Interpolator interpolator, boolean flywheel) { super(context, interpolator, flywheel); }@Override public void startScroll(int startX, int startY, int dx, int dy) { super.startScroll(startX, startY, dx, dy, mScrollDuration); }@Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, mScrollDuration); }public void initViewPagerScroll(ViewPager viewPager) { try { Field mScroller = ViewPager.class.getDeclaredField("mScroller"); mScroller.setAccessible(true); mScroller.set(viewPager, this); } catch (Exception e) { e.printStackTrace(); } }}}

小圆点选择shape

小圆点未选择shape

ViewPager引用布局(其实就是引用个ImageView,我这是圆角)

【自定义轮播图加小圆点】

    推荐阅读