viewpager左右滑动
来源:互联网 发布:工程项目优化管理ppt 编辑:程序博客网 时间:2024/05/24 05:54
ViewPager动态向前向后加载数据
以前写过一次这个文章,在这儿,直到上周末,做一个图片应用的时候,发现以前出现了方向性错误,导致可能误导了一些人,大家看到以前那篇文章的时候,估计没有几个人能看明白是怎么回事儿,在动态向前向后加载的时候,有不少的小逻辑判断,极容易出错,而且不断的设置setCurrentItem(),在临界的时候,其实用了一个先把viewPager设置为无动画,跳转一次位置,再设置viewPager有动画,再次跳转位置,模拟有动画的效果,其实在这个操作过程中仔细看,能看出来page的变化的,效果不好。
好了,扯了这么大一通,从上面一段就可以看出来以前写得不简单了,下面是新的思路,效果和逻辑都很简单:
再来回顾一下这个功能的应用场景:有一个装有很多条数据的一个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误导了。
01
public
class
DemoAdapter
extends
PagerAdapter {
02
03
private
Context context;
04
private
ArrayList list;
05
private
LayoutInflater inflater;
06
07
public
DemoAdapter (Context context, ArrayList list) {
08
this
.list = list;
09
this
.context = context;
10
inflater = LayoutInflater.from(context);
11
12
}
13
14
@Override
15
public
void
destroyItem(ViewGroup container,
int
position, Object object) {
16
((ViewPager) container).removeView((View) object);
17
}
18
19
@Override
20
public
void
finishUpdate(View container) {}
21
22
@Override
23
public
int
getCount() {
24
return
list !=
null
? list.size() :
0
;
25
}
26
27
@Override
28
public
Object instantiateItem(ViewGroup view,
int
position) {
29
30
UserBean bean = list.get(position);
31
32
//自定义的view
33
View userLayout = inflater.inflate(R.layout.show_user_detail, view,
false
);
34
ImageView ivPhoto = (ImageView) userLayout.findViewById(R.id.user_photo);
35
TextView tvName = (TextView) userLayout.findViewById(R.id.user_name);
36
37
//填充数据
38
tvName.setText(bean.getUserName);
39
40
((ViewPager) view).addView(userLayout,
0
);
41
return
userLayout;
42
}
43
44
@Override
45
public
boolean
isViewFromObject(View view, Object object) {
46
return
view.equals(object);
47
}
48
49
@Override
50
public
void
restoreState(Parcelable state, ClassLoader loader) {}
51
52
@Override
53
public
Parcelable saveState() {
54
return
null
;
55
}
56
57
@Override
58
public
void
startUpdate(View container) {}
59
}
看完上面这段代码是不是很简单,还要注意一点就是,你在外面的listView从哪儿跳进viewPager的时候,要在viewPager设置完adapter的时候setCurretntIndex一下,就像下面这样:
1
viewPager.setCurrentItem(intoPosition)
我还做了个简单的DEMO放在Github上,超级简单,其实就是跟平常用adapter一样:地址 .
- viewpager 实现左右滑动
- ViewPager左右循环滑动
- ViewPager左右滑动效果
- viewpager左右循环滑动
- viewpager禁用左右滑动
- 禁止ViewPager左右滑动
- 禁止ViewPager左右滑动
- viewpager无限左右滑动
- viewpager左右滑动
- ViewPager禁止左右滑动
- ViewPager禁用左右滑动
- ViewPager禁止左右滑动
- 禁止ViewPager左右滑动
- viewpager 左右滑动笔记
- Viewpager禁止左右滑动
- 禁止ViewPager左右滑动
- ViewPager限制左右滑动
- 禁止ViewPager左右滑动
- 数据库中5种范式
- (译)缓存在AFNetworking中是如何工作的?AFImageCache和NSUrlCache给你答案
- Cocos3.0 的android返回键功能实现
- INFA调优
- JAVA之Set
- viewpager左右滑动
- LeetCode 1 : Two Sum
- 使用伪元素before和after写出来的神奇效果
- android学习笔记(十)——音乐播放器的实现
- 图解服务器端网络架构
- eclipse安装和JDK的配置
- 修改cas-server(五),ajax无需页面登录。
- 栈的链式存储 - API实现
- leetcode 026 —— Remove Duplicates from Sorted Array