Android中轮播图的实现

上一次我说了一个小红点指示器的做法,结和这个,突然让我想到了一种用小红点比较多的地方,那就是轮播图。其实轮播图没什么,一个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我们在上一篇博客中讲了具体代码和用法,这里贴上链接大家参考。

Android中关于小红点指示器的制作

好,接下来是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()。具体我就不改了,大家自行参悟。有问题可以在留言区给我留言。

猜你喜欢

转载自blog.csdn.net/weixin_38322371/article/details/114818589