Android中ViewPager(让用户可以左右切换当前的view)

本文介绍如何使用ViewPager实现无限循环滑动效果,包括添加标题、指示器及自定义适配器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

viewpager

ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view。
1)ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类。

2)ViewPager类需要一个PagerAdapter适配器类给它提供数据。

3)ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。

  在编写ViewPager的应用的使用,还需要使用两个组件类分别是PagerTitleStrip类和PagerTabStrip类,PagerTitleStrip类直接继承自ViewGroup类,而PagerTabStrip类继承PagerTitleStrip类,所以这两个类也是容器类。但是有一点需要注意,在定义XML的layout的时候,这两个类必须是ViewPager标签的子标签,不然会出错。

自己写的例子

效果图:

这里写图片描述

步骤:

1、我这里写了五个界面,所以要建立5个layout用来放界面
2,写一个主layout,里面放ViewPager,PagerTitleStrip和圆点
3,定义一个ViewPager的适配器MyPagerAdapter类

MyPagerAdapter主要重写下面4个方法:
1. public int getCount()
2. public Object instantiateItem(ViewGroup container, int position)
3. public void destroyItem(ViewGroup container, int position, Object object)
4. public boolean isViewFromObject(View view, Object object)

4,在oneActivity中将生成的五个界面加入到ViewPager中,并动态添加底部小圆点。

循环界面:

在MyPagerAdapter里重写的getCount()方法里,把返回值改成一个比较大的数,这样就可以伪造一个类似循环界面的情况

@Override //getCount():返回要滑动的VIew的个数,存储在list集合里
    public int getCount() {
       return Integer.MAX_VALUE;
    }

oneAdapter

 //把图片的第一张放到总页数的中间
     mViewPager.setCurrentItem(Integer.MAX_VALUE/2-Integer.MAX_VALUE/2%views.size());

底部加小圆点:

 //循环得到点,这里的5是因为有五个界面
        for (int i = 0; i < 5; i++) {
            ImageView iv1 = new ImageView(this);
            //设置点的宽高,注意宽不能设成match_parent,不然点就会被挤没
            iv1.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            iv1.setImageResource(R.mipmap.unchecked);
                               //设置点的距离
            mPoints.add(iv1);//把点都加到数组mPoints
            mLinearLayoutContainer.addView(iv1);//把点添加到layout布局中
        }
        mPoints.get(0).setImageResource(R.mipmap.checked);//把第一个点设成选中状态
        vpAdapter = new MyPagerAdapter(titleList, views);  // 初始化Adapter
        mViewPager.setAdapter(vpAdapter);
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override//当滑动时改变点的状态
            public void onPageSelected(int position) {
                    setBackPoint(position%views.size());
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
         //改变点的状态的方法
    public void setBackPoint(int position){
        for(ImageView iv:mPoints){
            iv.setImageResource(R.mipmap.unchecked);
        }
        mPoints.get(position).setImageResource(R.mipmap.checked);

    }

加标题:

在activity_main.xml里添加

 <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.v4.view.PagerTitleStrip
            android:id="@+id/pagertitle"
            android:background="#ABABAB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top" />
    </android.support.v4.view.ViewPager>

在MyPagerAdapter重写

@Override//用来添加标题
    public CharSequence getPageTitle(int position) {
        return titleList.get(position % views.size());
    }

在oneActivity加:

// 每个页面的Title数据
        titleList = new ArrayList<String>();
        titleList.add("春日");
        titleList.add("夏花");
        titleList.add("秋叶");
        titleList.add("冬雪");
        titleList.add("云雪");
        mPoints = new ArrayList<>();//把点都放到这个集合里

源码:

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
      //这里调用javaV4包需要全名调用
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.v4.view.PagerTitleStrip
            android:id="@+id/pagertitle"
            android:background="#ABABAB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top" />
    </android.support.v4.view.ViewPager>
    <LinearLayout
        android:id="@+id/linearlayout_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:gravity="center"
        android:layout_marginBottom="20dp"
        android:orientation="horizontal" >
    </LinearLayout>
</RelativeLayout>
view1

其他四个view也这样写,只是图片不同

<?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:gravity="center">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@mipmap/bb" />
</RelativeLayout>
oneActivity.java
package myViewPager;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.example.administrator.mypager.R;

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

/**
 * Created by Administrator on 2015/9/4.
 */
public class oneActivity extends Activity  {
    private ViewPager mViewPager;
    private ArrayList<View> views;
    private LayoutInflater mInflater;
    private MyPagerAdapter vpAdapter;
    private List<String> titleList;  //标题列表数组
    private LinearLayout mLinearLayoutContainer;
    private ArrayList<ImageView> mPoints;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        mLinearLayoutContainer = (LinearLayout) findViewById(R.id.linearlayout_container);
        views = new ArrayList<View>();//用来放图片的集合
        mInflater = getLayoutInflater();
        // 初始化引导图片列表
        views.add(mInflater.inflate(R.layout.view1, null));
        views.add(mInflater.inflate(R.layout.view2, null));
        views.add(mInflater.inflate(R.layout.view3, null));
        views.add(mInflater.inflate(R.layout.view4, null));
        views.add(mInflater.inflate(R.layout.view5, null));
        // 每个页面的Title数据
        titleList = new ArrayList<String>();
        titleList.add("春日");
        titleList.add("夏花");
        titleList.add("秋叶");
        titleList.add("冬雪");
        titleList.add("云雪");
        mPoints = new ArrayList<>();//把点都放到这个集合里
        //循环得到点,这里的5是因为有五个界面
        for (int i = 0; i < 5; i++) {
            ImageView iv1 = new ImageView(this);
            //设置点的宽高,注意宽不能设成match_parent,不然点就会被挤没
            iv1.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            iv1.setImageResource(R.mipmap.unchecked);
                               //设置点的距离
            mPoints.add(iv1);//把点都加到数组mPoints
            mLinearLayoutContainer.addView(iv1);//把点添加到layout布局中
        }
        mPoints.get(0).setImageResource(R.mipmap.checked);//把第一个点设成选中状态
        vpAdapter = new MyPagerAdapter(titleList, views);  // 初始化Adapter
        mViewPager.setAdapter(vpAdapter);
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override//当滑动时改变点的状态
            public void onPageSelected(int position) {
                    setBackPoint(position%views.size());
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        //把图片的第一张放到总页数的中间
        mViewPager.setCurrentItem(Integer.MAX_VALUE/2-Integer.MAX_VALUE/2%views.size());

    }
    //改变点的状态的方法
    public void setBackPoint(int position){
        for(ImageView iv:mPoints){
            iv.setImageResource(R.mipmap.unchecked);
        }
        mPoints.get(position).setImageResource(R.mipmap.checked);

    }
    }
MyPagerAdapter.java
package myViewPager;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.example.administrator.mypager.R;

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

/**
 * Created by Administrator on 2015/9/4.
 */
public class oneActivity extends Activity  {
    private ViewPager mViewPager;
    private ArrayList<View> views;
    private LayoutInflater mInflater;
    private MyPagerAdapter vpAdapter;
    private List<String> titleList;  //标题列表数组
    private LinearLayout mLinearLayoutContainer;
    private ArrayList<ImageView> mPoints;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        mLinearLayoutContainer = (LinearLayout) findViewById(R.id.linearlayout_container);
        views = new ArrayList<View>();//用来放图片的集合
        mInflater = getLayoutInflater();
        // 初始化引导图片列表
        views.add(mInflater.inflate(R.layout.view1, null));
        views.add(mInflater.inflate(R.layout.view2, null));
        views.add(mInflater.inflate(R.layout.view3, null));
        views.add(mInflater.inflate(R.layout.view4, null));
        views.add(mInflater.inflate(R.layout.view5, null));
        // 每个页面的Title数据
        titleList = new ArrayList<String>();
        titleList.add("春日");
        titleList.add("夏花");
        titleList.add("秋叶");
        titleList.add("冬雪");
        titleList.add("云雪");
        mPoints = new ArrayList<>();//把点都放到这个集合里
        //循环得到点,这里的5是因为有五个界面
        for (int i = 0; i < 5; i++) {
            ImageView iv1 = new ImageView(this);
            //设置点的宽高,注意宽不能设成match_parent,不然点就会被挤没
            iv1.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            iv1.setImageResource(R.mipmap.unchecked);
                               //设置点的距离
            mPoints.add(iv1);//把点都加到数组mPoints
            mLinearLayoutContainer.addView(iv1);//把点添加到layout布局中
        }
        mPoints.get(0).setImageResource(R.mipmap.checked);//把第一个点设成选中状态
        vpAdapter = new MyPagerAdapter(titleList, views);  // 初始化Adapter
        mViewPager.setAdapter(vpAdapter);
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override//当滑动时改变点的状态
            public void onPageSelected(int position) {
                    setBackPoint(position%views.size());
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        //把图片的第一张放到总页数的中间
        mViewPager.setCurrentItem(Integer.MAX_VALUE/2-Integer.MAX_VALUE/2%views.size());

    }
    //改变点的状态的方法
    public void setBackPoint(int position){
        for(ImageView iv:mPoints){
            iv.setImageResource(R.mipmap.unchecked);
        }
        mPoints.get(position).setImageResource(R.mipmap.checked);

    }
    }
### 解决方案 在 MyBatis-Plus 的代码生成器中,默认情况下不会覆盖已存在的文件。如果希望实现 `UserMapper.xml` 文件的覆盖功能,则可以通过自定义模板引擎来完成此操作。 以下是具体的解决方案: #### 自定义 FreeMarker 模板引擎 通过继承 `DefaultFreemarkerTemplateEngine` 类来自定义模板引擎,并设置其行为以允许覆盖已有文件。 ```java import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import com.baomidou.mybatisplus.core.toolkit.StringPool; public class CustomFreeMarkerTemplateEngine extends FreemarkerTemplateEngine { @Override protected void outputFile(String templateName, String filePath, Map<String, Object> objectMap) throws Exception { super.outputFile(templateName, filePath, objectMap); System.out.println("Generated file: " + filePath); // 可选日志记录 } } ``` 上述方法会调用父类中的 `outputFile` 方法,而默认的行为已经包含了覆盖逻辑[^1]。 #### 配置 GeneratorConfig 中的 Template Engine 为了使自定义模板生效,在初始化 `AutoGenerator` 对象时需指定该模板引擎实例。 ```java import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; import com.baomidou.mybatisplus.generator.config.StrategyConfig; import com.baomidou.mybatisplus.generator.config.TemplateConfig; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; public static void main(String[] args) { AutoGenerator mpg = new AutoGenerator(); // 设置数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("password"); mpg.setDataSource(dsc); // 全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); // 输出目录 gc.setAuthor("luoyu"); // 作者名称 gc.setOpen(false); // 是否打开输出目录 gc.setFileOverride(true); // 开启文件覆盖模式 mpg.setGlobalConfig(gc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.example.demo"); pc.setModuleName(null); // 不使用模块名 mpg.setPackageInfo(pc); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true); strategy.setRestControllerStyle(true); strategy.setInclude("user"); // 表名集合 mpg.setStrategy(strategy); // 模板配置 (可选) TemplateConfig tc = new TemplateConfig(); tc.setXml(null); // 如果不需要 XML 则可以禁用它 mpg.setTemplate(tc); // 使用自定义模板引擎 mpg.setTemplateEngine(new CustomFreeMarkerTemplateEngine()); // 执行生成 mpg.execute(); } ``` 以上代码片段展示了如何启用文件覆盖机制以及集成自定义模板引擎的功能[^2]。 --- ### 注意事项 1. **确认依赖版本** 确保项目使用的 MyBatis-Plus 版本与 Spring Boot 版本兼容。例如,Spring Boot 2.2.5 和 MyBatis-Plus 3.3.1 是经过验证的组合。 2. **路径冲突检测** 当前工作目录下的目标路径应确保无权限限制或其他潜在冲突问题。 3. **XML 覆盖风险评估** 启用文件覆盖可能会导致手动调整的内容被丢失,请提前备份重要文件。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值