Android ViewPager无限滑动(支持左右,存在传入数量限制)方式二
来源:互联网 发布:美微网络柠檬视频tv 编辑:程序博客网 时间:2024/05/17 07:22
实现思路:
主要是设置Adapter中的getCount() 返回 Integer.MAX_VALUE
功能:
- 在特定数量以上时,能够实现无限滑动
代码:
package com.view.pager;import java.lang.reflect.Field;import java.util.ArrayList;import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;/** * ViewPager无限滑动 */public class MainActivity extends Activity { // 上下文 private Context mContext; // =============== 控件View ============== // ViewPager private ViewPager viewPager; // 页数显示 private TextView page_tv; // =============== 其他对象 ============== // 展示的View private ArrayList<ImageView> listIgViews = new ArrayList<ImageView>(); // 需要展示的数据 private ArrayList<Integer> listDraws = new ArrayList<Integer>(); // 总数 private int count = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = MainActivity.this; // 初始化操作 initViews(); initValues(); initListeners(); } /** * 初始化控件 */ private void initViews() { viewPager = (ViewPager) this.findViewById(R.id.viewpager); page_tv = (TextView) this.findViewById(R.id.page_tv); } /** * 初始化参数 */ private void initValues() { // 反射初始化数据 initReflect(); // 获取总数 count = listDraws.size(); // count = 2 左滑可以一次,右滑黑屏 // count = 3,能无限右滑,左滑可以一次,然后挂掉 // count >=4 则一开始能够左右无限滑 // 只有在大于等于4的时候适用这种方式 // 动态添加View for (int i = 0; i < count; i++) { ImageView igView = createIgView(); // 创建View igView.setImageResource(listDraws.get(i)); // 设置图片 listIgViews.add(igView); // 保存View } // 初始化适配器,并绑定 ViewPagerAdapter adapter = new ViewPagerAdapter(); viewPager.setAdapter(adapter); viewPager.setEnabled(false); //设置ViewPager的默认项, 设置为长度的100倍,并且需要数量大于等于4才能左右无限滑动 viewPager.setCurrentItem(count * 100); // 默认显示页数 refViewData(0); } /** * 初始化事件 */ private void initListeners() { // ViewPager滑动事件 viewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int pos) { refViewData(pos % count); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } int lastState = 0; /** * ViewPager的适配器 */ class ViewPagerAdapter extends PagerAdapter { @Override public Object instantiateItem(ViewGroup container, int position) { ((ViewPager)container).addView(listIgViews.get(position % count), 0); return listIgViews.get(position % count); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager)container).removeView(listIgViews.get(position % count)); } } /** * 反射初始化数据-获取Drawable,需要注意后缀,如果存在.xml文件,则会出异常 */ private void initReflect() { Field[] fields = R.drawable.class.getDeclaredFields(); for (Field field : fields) { String fName = field.getName(); if (!"ic_launcher".equals(fName)) { try { int index = field.getInt(R.drawable.class); listDraws.add(index); } catch (Exception e) { e.printStackTrace(); } } } } /** * 生成View,(可以导入Xml,直接返回View) * @return */ private ImageView createIgView() { ImageView igView = new ImageView(mContext); return igView; } /** * 刷新View数据 */ private void refViewData(int select) { // 显示当前页数 page_tv.setText((select + 1)+ "/" + (count)); }}
Demo下载:
ViewPagerInfinite无限滑动方式二 - 677KB
总结:
优点:
- 个人觉得比之前那种的看上去不会那么不协调
缺点:
- 需要大于等于4个Item时候,才能算真正的无限滑动
- 删除对应索引后刷新View,比较复杂(数量低于4会出问题)
优化:
- 刷新View,设置PagerAdapter 的 getItemPosition(Object object);方法,return POSITION_NONE;
- 判断数量低于4的时候切换方式,分别在,getCount()、instantiateItem()、destroyItem(),方法判断如果 总数小于4,则使用另外一种方法,但是这样低于4则不能无限滑动
这种方式,我比较少用,所以也没专门去写一个来判断,大家将就着用,可能比方式一最大的优势,就是比较协调。
如果有其他问题或者优化,请联系我,私信、评论都行,有时间会回复
0 0
- Android ViewPager无限滑动(支持左右,存在传入数量限制)方式二
- Android ViewPager无限滑动(支持左右,无传入数量限制)方式一
- android viewpager 无限左右滑动
- viewpager无限左右滑动
- ViewPager限制左右滑动
- 实现viewPager无限左右滑动
- Android ViewPager 无限循环左右滑动(可自动) 实现
- ViewPager实现左右无限循环滑动
- ViewPager 简单实现左右无限滑动.
- ViewPager无限轮播(真正的左右无限滑动)
- android viewpager左右循环滑动
- Android ViewPager左右滑动月历
- android viewpager 禁止左右滑动
- Android Viewpager拦截 左右滑动
- Android禁止ViewPager左右滑动
- android - ViewPager 监听左右滑动
- android viewpager禁止左右滑动
- Android 禁止ViewPager左右滑动
- UGUI下拉列表修改(0813Edit)
- Android编程之LocalBroadcastManager源码详解
- [推荐算法]Pearson Correlation Similarity 的python实现
- The last packet sent successfully to the server was 0 milliseconds ago, The driver has not received
- 韩信点兵
- Android ViewPager无限滑动(支持左右,存在传入数量限制)方式二
- HDU 5385
- 应用程序的makefile编写例程
- 2015.08.13
- foj Problem 1894 志愿者选拔---单调队列
- 读书笔记_高质量程序设计指南C++/C语言_10_文件结构和版式
- linux 设备模型(二 driver)
- 黑马程序员———API之Object、String和Scanner
- 倒立三角形