怎么样在Android ViewPager中实现上一页下左右滑动?
怎么样在Android ViewPager中实现上一页下左右滑动?
回顾一下这个功能的应用场景:有一个装有很多条数据的一个list,这个list在listView中显示出来了,现在滑动listView随便到一个位置,点击一个item进入数据的详情页,在这个详情页,我们用到了viewPager,让它实现左右滑动的效果。
以前我也是在网上找的DEMO,大家通常的做法是,一进入详情页,就把每个页面的view初始化出来,然后把这些view放在list里面,传给自己定义的viewPagerAdapter,这样就出现滑动效果了。但是这样就会出现一个问题,就是我的list太大,初始化出来的view页面就会很多,比如说1000条数据,不可能全初始化出view来放list里再传给adapter吧,这样八成OOM的,于是我就照着这个思路,先初始化一部分view,再不断的滑动过程中,再初始化一部分,但是如果你是从数据列表的中间进入,向前滑动时不断的初始化view添加进list,这样viewPagerAdapter的大小就会发生变化,你的currentIndex就在不断的变化。超级不好控制。
再回想一下我们平时做一些常见的adapter的做法,没有在activity中把所有的item初始化出来,再传给adapter,让adapter做显示吧,常用的做法是,在adapter里再进行数据的封装什么的,在adapter中的getView()中进行操作,无论是自定义界面,还是填充数据。其实,viewPager的PagerAdapter也是同样的思路。回想一下,其实就是基本的adapter的操作了,以前刚学习这个控件的时候被网上别人的demo误导了。
public class DemoAdapter extends PagerAdapter { private Context context; private ArrayList list; private LayoutInflater inflater; public DemoAdapter (Context context, ArrayList list) { this.list = list; this.context = context; } @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager) container).removeView((View) object); }
inflater = LayoutInflater.from(context);
@Override public void finishUpdate(View container) {} @Override public int getCount() { return list != null ? list.size() : 0; } @Override public Object instantiateItem(ViewGroup view, int position) { UserBean bean = list.get(position); //自定义的view View userLayout = inflater.inflate(R.layout.show_user_detail, view, false); ImageView ivPhoto = (ImageView) userLayout.findViewById(R.id.user_photo); TextView tvName = (TextView) userLayout.findViewById(R.id.user_name); //填充数据 tvName.setText(bean.getUserName); ((ViewPager) view).addView(userLayout, 0); return userLayout; } @Override public boolean isViewFromObject(View view, Object object) { return view.equals(object); } @Override public void restoreState(Parcelable state, ClassLoader loader) {} @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View container) {} }
看完上面这段代码是不是很简单,还要注意一点就是,你在外面的listView从哪儿跳进viewPager的时候,要在viewPager设置完adapter的时候setCurretntIndex一下,就像下面这样:
1
|
viewPager.setCurrentItem(intoPosition) |