Android ViewPager导航小圆点实现无限循环效果

作者:flowerff 时间:2022-07-09 13:10:33 

之前用View Pager做了一个图片切换的推荐栏(就类似与淘宝、头条客户端顶端的推荐信息栏),利用View Pager很快就能实现,但是一次无意间使用淘宝APP的时候,突然发现它的效果和我做的还不一样,淘宝APP的推荐栏可以左右无限循环切换,而ViewPager自身其实并没有支持这个功能。

其实实现这个无限循环不难,只需要在数据源的首尾各添加一张多余的图片,在onPagerChangeListener()中监听position<1和position>(总数据条目-1)就可以了。另外一点需要注意的是,这里的数据源+2,而导航小圆点却比数据源少2,这样在无限循环的时候,小圆点的切换就不好办了。本人最开始也是写逻辑在onPageSelected()里面判断条件,总感觉挺麻烦的,有没有更好的实现方式呢。答案是肯定的。只需将小圆点也首尾各家一个,并设置为invisible不就好了?

我的代码实现如下:

xml布局:


<?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.support.v4.view.ViewPager
   android:id="@+id/vp_homepage"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   ></android.support.v4.view.ViewPager>

<LinearLayout
   android:id="@+id/ll_dots_homepage_top"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_alignParentBottom="true"
   android:layout_marginBottom="8dp"
   android:gravity="center"
   android:orientation="horizontal">

<ImageView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:clickable="true"
     android:padding="5dp"
     android:visibility="invisible"
     android:src="@drawable/dots"/>

<ImageView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:clickable="true"
     android:padding="5dp"
     android:src="@drawable/dots"/>

<ImageView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:clickable="true"
     android:padding="5dp"
     android:src="@drawable/dots"/>

<ImageView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:clickable="true"
     android:padding="5dp"
     android:src="@drawable/dots"/>

<ImageView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:clickable="true"
     android:padding="5dp"
     android:src="@drawable/dots"/>

<ImageView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:clickable="true"
     android:padding="5dp"
     android:visibility="invisible"
     android:src="@drawable/dots"/>
 </LinearLayout>

</RelativeLayout>

界面实现:


public class HomePageFragment extends BaseFragment {

private View view;
 private ViewPager mViewPager;//顶部信息推荐栏
 private MyViewPagerAdapter mViewPagerAdapter;
 private LinearLayout ll_dots_homepage_top;//顶部信息推荐栏导航点
 private int GUIDE_NUMBER = 4; //顶部信息推荐栏的数量
 private ImageView[] dotImages; //顶部信息推荐栏引导小圆点
 private int dotCurrentIndex; //顶部信息推荐栏小圆点偏移量
 private MyOnPageChangeListener mOnPageChangeListener;

private List<View> mListDataViewPage;
 private Context context;

@Override
 public void onAttach(Context context) {
   super.onAttach(context);
   this.context = context;
 }

@Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable
     Bundle savedInstanceState) {
   view = inflater.inflate(R.layout.frament_homepage, container, false);

initData();
   initView();

return view;
 }

/**
  * 初始化一些基础数据
  */
 private void initData() {
   if (mListDataViewPage != null) {
     mListDataViewPage.clear();
     mListDataViewPage = null;
   } else {
     mListDataViewPage = new ArrayList<>();
     // 为了实现无限循环,首位两张图片都是重复的
     int[] resource = new int[]{
         R.drawable.test_viewpager_homepage_4, R.drawable.test_viewpager_homepage_1, R.drawable.test_viewpager_homepage_2, R
         .drawable.test_viewpager_homepage_3, R.drawable.test_viewpager_homepage_4,R.drawable.test_viewpager_homepage_1,};

for (int i = 0; i < 6; i++) {
       WeakReference<Bitmap> bitmao = new WeakReference<Bitmap>(BitmapFactory
           .decodeResource(getResources(), resource[i]));
       ImageView imageView = new ImageView(context);
       imageView.setImageBitmap(bitmao.get());
       imageView.setScaleType(ImageView.ScaleType.FIT_XY);
       mListDataViewPage.add(imageView);
     }

}

}

/**
  * 初始化底部推信息推荐栏引导小圆点View
  */
 private void initDots() {
   dotImages = new ImageView[mListDataViewPage.size()];
   for (int i = 0; i < mListDataViewPage.size(); i++) {
     dotImages[i] = (ImageView) ll_dots_homepage_top.getChildAt(i);
     dotImages[i].setEnabled(false);
   }
   **//将第一个小圆点设置为高亮,这里的第一个偏移量是1,不是0
   dotImages[1].setEnabled(true);
   dotCurrentIndex = 1;**
 }

/**
  * initView
  */
 private void initView() {
   findLayout();
   findView();
 }

/**
  * findLayout
  */
 private void findLayout() {
   ll_dots_homepage_top = (LinearLayout) view.findViewById(R.id.ll_dots_homepage_top);
   initDots();

}

/**
  * 初始化控件
  */
 private void findView() {
   mViewPager = (ViewPager) view.findViewById(R.id.vp_homepage);

mViewPagerAdapter = new MyViewPagerAdapter(mListDataViewPage);
   mOnPageChangeListener = new MyOnPageChangeListener();
   mViewPager.setAdapter(mViewPagerAdapter);
   mViewPager.setOnPageChangeListener(mOnPageChangeListener);
   **mViewPager.setCurrentItem(1,false); //默认选中第二张图片**
 }

private class MyOnPageChangeListener implements ViewPager.OnPageChangeListener {

@Override
   public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
   public void onPageSelected(int position) {
     if (position < 0 || position > mListDataViewPage.size() || position == dotCurrentIndex) {
       return;
     }

if ( mListDataViewPage.size() > 1) { //多于1,才会循环跳转
       if ( position < 1) { //首位之前,跳转到末尾(N)
         position = 4;
         mViewPager.setCurrentItem(position,false);
       } else if ( position > 4) { //末位之后,跳转到首位(1)
         position = 1;
         mViewPager.setCurrentItem(position,false); //false:不显示跳转过程的动画

}else {
         dotImages[dotCurrentIndex].setEnabled(false);
         dotImages[position].setEnabled(true);
         dotCurrentIndex = position;
       }
     }

}

@Override
   public void onPageScrollStateChanged(int state) {

}
 }
}

注意代码中加粗的代码。初始的小圆点选中和ViewPager的position选中。

来源:http://blog.csdn.net/flowerff/article/details/77429618

标签:ViewPager,导航,无限循环
0
投稿

猜你喜欢

  • Spring Boot统一处理全局异常的实战教程

    2023-11-24 20:51:34
  • 一步步教你如何创建第一个C#项目

    2021-08-15 04:41:56
  • C#获取打印机列表方法介绍

    2022-07-29 02:54:38
  • Java使用TCP套接字实现多人聊天功能详解

    2023-12-16 15:42:40
  • 在WinForm中发送HTTP请求的实现方法

    2023-01-28 10:47:35
  • 在Android界面上显示和获取Logcat日志输出的方法

    2023-02-19 20:02:19
  • C#中多态、重载、重写区别分析

    2022-06-27 22:49:55
  • android开发之Json文件的读写的示例代码

    2021-12-02 11:55:18
  • 解决RabbitMq消息队列Qos Prefetch消息堵塞问题

    2021-11-17 17:36:13
  • C# 抓图服务的实现

    2023-04-03 20:10:12
  • Spring学习笔记之bean的基础知识

    2021-09-08 10:09:27
  • spring AOP定义AfterThrowing增加处理实例分析

    2021-07-11 14:22:11
  • Spring整合WebSocket应用示例(上)

    2023-05-05 10:09:21
  • 高吞吐、线程安全的LRU缓存详解

    2021-10-01 01:40:28
  • TOMCAT内存溢出及大小调整的实现方法

    2023-02-24 06:55:33
  • Spring IOC与DI核心重点分析

    2023-11-12 14:35:55
  • Java系统的高并发解决方法详解

    2021-08-23 08:39:50
  • 修改Maven settings.xml 后配置未生效的解决

    2023-07-06 22:17:03
  • JDK14新特性之switch表达式的实现

    2022-06-01 17:49:31
  • 解读Spring-boot的debug调试

    2022-06-09 15:04:06
  • asp之家 软件编程 m.aspxhome.com