Android ViewPager无限滑动(支持左右,存在传入数量限制)方式二

来源:互联网 发布:美微网络柠檬视频tv 编辑:程序博客网 时间:2024/05/17 07:22

实现思路:


主要是设置Adapter中的getCount() 返回 Integer.MAX_VALUE


功能:


  1. 在特定数量以上时,能够实现无限滑动

代码:


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
原创粉丝点击