Android轮播图

本文介绍了如何在Android中使用RelativeLayout布局和ViewPager实现自动轮播图,包括图片加载和指示器小圆点同步切换。同时,讨论了Handler可能导致的内存泄漏问题,并提供了两种避免内存泄漏的方法:非静态Handler和使用内部类的静态Handler。
摘要由CSDN通过智能技术生成

布局代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <androidx.viewpager.widget.ViewPager
        android:id="@+id/test_view_pager"
        android:layout_width="match_parent"
        android:layout_height="250dp"/>
    <LinearLayout
    <!--指示器小圆点-->
        android:id="@+id/test_point_ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_below="@+id/test_view_pager"
        android:gravity="center_horizontal"></LinearLayout>
</RelativeLayout>

ViewPagerTestActivity

package com.wdf.zmkfsdk;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;import android.widget.ImageView;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;

public class ViewPagerTestActivity extends AppCompatActivity {
    ViewPager pager;
    LinearLayout layout;
    //轮播图图片集合
    int[] imgId = {R.mipmap.pic_1,R.mipmap.pic_2,R.mipmap.pic_3};
    //ViewPager数据源集合
    List<ImageView> vpList;
    //指示器小圆点集合
    List<ImageView> pointList;
    //定时滑动轮播图图片
    /*方法一:非静态Handler可能会造成内存泄露
    Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what){
                case 1:
                    int item = pager.getCurrentItem();
                    //如果当前图片是最后一张则返回第一张
                    if(item == vpList.size()-1){
                        pager.setCurrentItem(0);
                    }else {
                        item++;
                        pager.setCurrentItem(item);
                    }
                    //循环发送信息
                    handler.sendEmptyMessageDelayed(1,5000);
                    break;
            }
        }
    };*/

	//方法二:
	private static Handler handler = new Handler(Looper.getMainLooper());

    public static class MyRunnable implements Runnable{
        @Override
        public void run() {
            int item = pager.getCurrentItem();
            if(item == vpList.size()-1){
                pager.setCurrentItem(0);
            }else {
                item++;
                pager.setCurrentItem(item);
            }
            handler.postDelayed(new MyRunnable(),5000);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager_test);
        pager = findViewById(R.id.test_view_pager);
        layout = findViewById(R.id.test_point_ll);

        initPager();
        setPagerListener();
        //延迟5秒发送消息更新ViewPager
        //handler.sendEmptyMessageDelayed(1,5000);//方法一
        handler.postDelayed(new MyRunnable(),5000);//方法二
    }

    private void initPager() {
        vpList = new ArrayList<>();
        pointList = new ArrayList<>();
        //动态添加图片数据源集合和小圆点集合
        for(int i = 0; i < imgId.length;i++){
            ImageView imageView = new ImageView(this);
            imageView.setImageResource(imgId[i]);
            imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            imageView.setLayoutParams(params);
            vpList.add(imageView);

            ImageView pIv = new ImageView(this);
            pIv.setImageResource(R.mipmap.point_nomal);
            LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(20, 20);
            p.setMargins(5,0,5,0);
            pIv.setLayoutParams(p);
            pointList.add(pIv);
            layout.addView(pIv);
        }
        //默认第一个小圆点为选中状态
        pointList.get(0).setImageResource(R.mipmap.point_focus);
        //为ViewPager设置适配器
        MyPagerAdapter adapter = new MyPagerAdapter(this,vpList);
        pager.setAdapter(adapter);
    }

	//设置ViewPager监听,图片切换同步小圆点切换
    private void setPagerListener(){
        pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                for(int i=0;i<pointList.size();i++){
                    pointList.get(i).setImageResource(R.mipmap.point_nomal);
                }
                pointList.get(position).setImageResource(R.mipmap.point_focus);
            }
        });
    }
}

MyPagerAdapter

package com.wdf.zmkfsdk;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;

import java.util.List;

public class MyPagerAdapter extends PagerAdapter {
    Context context;
    //图片集合
    List<ImageView> ivList;

    public MyPagerAdapter(Context context, List<ImageView> ivList) {
        this.context = context;
        this.ivList = ivList;
    }

    @Override
    public int getCount() {
        return ivList.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        ImageView imageView = ivList.get(position);
        container.addView(imageView);
        return imageView;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        ImageView imageView = ivList.get(position);
        container.removeView(imageView);
    }
}

效果图

在这里插入图片描述

补充

Handler的使用
LayoutParams的详解
Handler警告
Handler警告处理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值