Android ViewPager实现的Android轮播|定时器的使用

本文详细介绍了如何在Android中实现自动轮播图功能,包括XML布局设计、ViewPager使用、小圆点的初始化与更新,以及定时任务的设置。通过创建自定义PagerAdapter,实现了无限轮播,并在页面切换时更新当前选中状态。此外,还提供了onStop时停止定时任务以节省资源的做法。
摘要由CSDN通过智能技术生成

效果图

在这里插入图片描述在这里插入图片描述在这里插入图片描述
xml布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
        <androidx.viewpager.widget.ViewPager
            android:layout_marginTop="50dp"
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="80dp"/>
        <LinearLayout
            android:layout_marginTop="10dp"
            android:layout_marginStart="244dp"
            android:layout_below="@+id/viewpager"
            android:id="@+id/point"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:orientation="horizontal">
        </LinearLayout>
</RelativeLayout>

.class处理

public class MainActivity extends AppCompatActivity {
    ViewPager viewPager;
    LinearLayout linearLayout;
    List<ImageView> imageViewList=new ArrayList<ImageView>();
    int currentItem=300;//当前item位置
    Timer mTimer;
    int[] resId={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.b};
    Handler myHandler=new Handler();

    TimerTask timerTask=new TimerTask() {
    @Override
    public void run() {
        myHandler.post(runnable);
    }
};
    private void start() {
        if (mTimer==null){
            mTimer=new Timer();
        }
        mTimer.schedule(timerTask,3000,3000);
    }

    /**
     * 更新UI操作
     */
    Runnable runnable=new Runnable() {
        @Override
        public void run() {
            currentItem++;
            int index=currentItem%4;
            updatePoint(index);//初始化小圆点
            viewPager.setCurrentItem(currentItem);
        }
    };
    /**
     * 初始化小圆点(如果不需要小圆点则不加)
     */
    private void initPoint(int i) {
        ImageView point=new ImageView(this);
        LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(20,20);
        point.setLayoutParams(params);
        if (i==0){
            point.setImageResource(R.drawable.point_checked);
        }else {
            point.setImageResource(R.drawable.point_normal);
        }
        linearLayout.addView(point);
    }

    /**
     * 更新小圆点(如果不需要小圆点则不加)
     * @param index
     */
    private void updatePoint(int index) {
        for (int i=0;i<imageViewList.size();i++){
            ImageView image= (ImageView) linearLayout.getChildAt(i);
            if (i==index){
                image.setImageResource(R.drawable.point_checked);
            }else {
                image.setImageResource(R.drawable.point_normal);
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        linearLayout=(LinearLayout)findViewById(R.id.point);
        viewPager=(ViewPager)findViewById(R.id.viewpager);
        for (int i=0;i<resId.length;i++){
            ImageView imageView=new ImageView(this);
            imageView.setImageResource(resId[i]);
            imageViewList.add(imageView);
            initPoint(i); //圆点
        }
        MyAdapter adapter=new MyAdapter();
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(currentItem); //一定要在setAdapter后面
        start();
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            /**
             * 更新当前item数目(currentPosition)转换item时调用此方法
             * @param position
             */
            @Override
            public void onPageSelected(int position) {
                currentItem=position;
                int index=position%imageViewList.size();
                updatePoint(index);//更新小圆点
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mTimer!=null) {
            mTimer.cancel();
            mTimer = null;
        }
    }
    public class MyAdapter extends PagerAdapter {
        public MyAdapter() {
            super();
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            int index = position % imageViewList.size();    //循环imageViewList里面的内容
            ((ViewPager) container).addView(imageViewList.get(index));
            return imageViewList.get(index);
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            ((ViewPager) container).removeView(imageViewList.get(position % imageViewList.size()));
        }

        /**
         * 设定tab数目为Integer.MAX_VALUE
         *
         * @return
         */
        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        myHandler.removeCallbacks(runnable);
    }
}

以上即可实现
可以参考:https://blog.csdn.net/yancychas/article/details/77892269

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AaVictory.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值