实现一个多图片的滑动
利用viewpager和fragment实现
在viewpager里的每一个view放入一个fragment,fragment里放一个imageview
fragment的数量不确定,是动态加载的,每次刷新需要重新加载一个viewpager
需要三个部分
一、配置文件
main.xml里加入Viewpager控件(android3以下好像要导入包)
<android.support.v4.view.ViewPager
android:id="@+id/myViewPager"
android:layout="match_parent"
android:layout="match_parent" />
</pre><span style="font-family: 'Microsoft YaHei'; font-size: 14px;"></span><p></p><p><span style="font-family:Microsoft YaHei; font-size:14px">自定义一个page.xml(加载的时候使用这个)</span></p><p></p><pre name="code" class="html"><ImageView
<span style="white-space:pre"> </span>android:id="@+id/myImageView"
<span style="white-space:pre"> </span>android:layout="match_parent"
<span style="white-space:pre"> </span>android:layout="match_parent"
<span style="white-space:pre"> </span>android:scaleType="centercrop" <!-- 图片显示在父类中心且自动缩放 --> />
二、碎片
从Fragment继承
fragment的生命流程和查资料得到的有些不太一样,在创建的时候Override加个log打印就知道了
1、初始化fragment对象并传入需要的内容
public static nowFragment newInstance(int pictureSeq, int nowRound, int nowTarget){
nowFragment adatperFragment = new nowFragment();
// 利用bundle传值
Bundle bundle = new Bundle();
bundle.putInt("pictureseq", pictureSeq);
bundle.putInt("nowround", nowRound);
bundle.putInt("nowtarget", nowTarget);
adatperFragment.setArguments(bundle);
return adatperFragment
}
2、在onCreateView的时候获取view
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
<span style="white-space:pre"> </span>view = inflater.inflate(R.layout.mypage,null);
<span style="white-space:pre"> </span>return view;
}
3、在onActivity设置这个fragment里的图片
@Override
public void onActivityCreated(Bundle bundle){
<span style="white-space:pre"> </span>super.onActivityCreated(bundle);
<span style="white-space:pre"> </span>imageView = (ImageView) view.findViewById(R.id,myImageView);
<span style="white-space:pre"> </span>Integer round = getArguments().getInt("nowround");
<span style="white-space:pre"> </span>Integer target = getArguments().getInt("nowtarget");
<span style="white-space:pre"> </span>Integer seq = getArguments().getInt("pictureseq");
<span style="white-space:pre"> </span>// 用自定义的方法设置imageView的图片,这里用了一个BitmapFactory从本地的jpg文件中decode
<span style="white-space:pre"> </span>bm = BitmapFactory.decodeFile(commonpath + target.toString() + "/" + round.toString() + "/" + seq.toString() +".jpg");
<span style="white-space:pre"> </span>imageView.setImageView(bm);
}
三、适配器
好像可以继承两种,FragmentPagerAdapter和FragmentStatePagerAdapter,后者更加适合动态加载
两者都实现了针对fragment的方法,不需要重写insatntiateItem了
需要重写的地方参考里面写的很清楚
最后主Activity里加个就行了
我是加在一个refreshMyViewPager方法里的
private void refreshMyViewPager(){
<span style="white-space:pre"> </span>ArrayList<nowFragment> list = new ArrayList<nowFragment>();
<span style="white-space:pre"> </span>for(int i = 0; i < pictureNum; i++){
<span style="white-space:pre"> </span>list.add(nowFragment.newInstance(i+1, nowRound, nowTarget));
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>adapter = new myViewPagerAdapter(getSupportFragmentManager(), list);
<span style="white-space:pre"> </span>nowViewPager.setAdapter(adapter);
}
此外,如果图片多的话会报out of memory异常,这是因为每个Fragment里都加载了bitmap,虽然FragmentStatePagerAdapter只会加载当前View的前后各一张也就是共三张,剩下的Fragment都会被Destroy,但是bm需要java自己的回收机制调用recycle去回收,没那么快,所以在fragment那个里面重新onDestroyView直接把bm给recycle应该就行了
@Override
public void onDestroyView(){
if(null != bm){
bm.recycle();
}
Log.i(TAG, "destroy view of " + num.toString());
super.onDestroyView();
}
参考:http://blog.youkuaiyun.com/siyehuazhilian/article/details/26384021
http://blog.youkuaiyun.com/forever_crying/article/details/8238863/