上一次我说了一个小红点指示器的做法,结和这个,突然让我想到了一种用小红点比较多的地方,那就是轮播图。其实轮播图没什么,一个ViewPager加上这个小红点指示器,我们完全可以自己做出来。不过嘛,产品要的是无限循环加自动轮播。好吧,于是催生了现在这个博客。
首先我们有一个布局。
activity_lb.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="200dp">
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<com.hao.baselib.widge.PagerIndicator
android:id="@+id/pageIndicator"
android:layout_width="100dp"
android:layout_height="20dp"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
</LinearLayout>
这里可以看到我们用到了一个ViewPager,还用到了一个PagerIndicator。ViewPager我就不多说了,PagerIndicator我们在上一篇博客中讲了具体代码和用法,这里贴上链接大家参考。
好,接下来是Activity的内容
LbActivity.java
public class LbActivity extends BaseActivity<LbModel> implements LbCallback {
private ViewPager mViewPager;
private HotSalePagerAdapter hotSalePagerAdapter;
//定时用的
private Handler mHandler;
private int currentPoint = 3 * 100;
private PagerIndicator pageIndicator;
@Override
protected LbModel getModelImp() {
return new LbModel(this, this);
}
@Override
protected int getContentLayoutId() {
return R.layout.activity_lb;
}
@Override
protected void initWidget() {
//初始化控件
mViewPager = findViewById(R.id.viewpager);
pageIndicator = findViewById(R.id.pageIndicator);
pageIndicator.setCount(3,10);
mViewPager.setPageMargin(24);
//设置适配器
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add("");
}
hotSalePagerAdapter = new HotSalePagerAdapter(this, list);
mViewPager.setAdapter(hotSalePagerAdapter);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (position%3 != 2){
pageIndicator.setCurrent(position % 3, positionOffset);
}
Log.i("aaaaaaaaaaaaaaaa","aaa"+position%3+"");
}
@Override
public void onPageSelected(int position) {
currentPoint = position+1;
Log.i("aaaaaaaaaaaaaaaa","bbb"+position%3+"");
pageIndicator.setCurrent(position%3,0);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
mViewPager.setCurrentItem(currentPoint);
mHandler = new Handler();
Runnable r = new Runnable() {
@Override
public void run() {
mViewPager.setCurrentItem(currentPoint);
//每隔10分钟循环执行run方法
mHandler.postDelayed(this, 3000);
}
};
//主线程中调用:
mHandler.postDelayed(r, 3000);//延时100毫秒
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(this);
}
}
}
大家可以根据具体情况把代码移植到自己的Activity或者Fragment中
最后是适配器
HotSalePagerAdapter.java
public class HotSalePagerAdapter extends PagerAdapter {
/**
* 上下文
*/
private Activity mContext;
/**
* 布局加载器
*/
private LayoutInflater mInflate;
/**
* 数据
*/
private ArrayList<String> mData;
/**
* 异步图片加载工具
*/
private DownloadImageLoader downloadImageLoader;
public HotSalePagerAdapter(Activity context,ArrayList<String> list){
mContext = context;
mData = list;
mInflate = LayoutInflater.from(mContext);
downloadImageLoader = DownloadImageLoader.getInstance();
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View rootView = mInflate.inflate(R.layout.item_banner,null);
ImageView imageView = rootView.findViewById(R.id.iv_banner);
if (position %3 == 0){
downloadImageLoader
.loadImage(mContext
,"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl" +
".duitang.com%2Fuploads%2Fitem%2F201902%2F03%2F20190203145913_" +
"yaynj.jpg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f" +
"9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1618128283&t=f0bcb9d5d6" +
"b7da4bd9a4b6fcd182c5db"
,R.mipmap.ic_about
,R.mipmap.ic_about
,imageView);
}else if (position % 3 == 1){
downloadImageLoader
.loadImage(mContext
,"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fn.sinaim" +
"g.cn%2Fsinacn12%2F456%2Fw640h616%2F20180821%2F0eed-hhzsnea12" +
"63343.jpg&refer=http%3A%2F%2Fn.sinaimg.cn&app=2002&size=f9" +
"999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1618128283&t=2f9e1755" +
"ce694edb99a8b43758cf7700"
,R.mipmap.ic_about
,R.mipmap.ic_about
,imageView);
}else if (position %3 == 2){
DownloadImageLoader.getInstance()
.loadImage(mContext
,"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg" +
".hkwb.net%2Fatt%2Fsite2%2F20151214%2F6782afe97a6e09a71fdb30" +
"4ccefb474a.jpg&refer=http%3A%2F%2Fimg.hkwb.net&app=2002&siz" +
"e=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1618128283&t=9d073" +
"8c4a9d2ea17dc36c2a52d1c8627"
,R.mipmap.ic_about
,R.mipmap.ic_about
,imageView);
}
container.addView(rootView,0);
return rootView;
}
}
这里适配器中我写了一个死值,大家可以根据具体情况给list中传入需要的值。并且我们需要修改相关的一些值,比如这里很多地方写的是3,要改成list.size()。具体我就不改了,大家自行参悟。有问题可以在留言区给我留言。