【Android】 Viewpager+Fragment实现滑动图片的动态加载

来源:互联网 发布:淘宝店铺冻结能退货吗 编辑:程序博客网 时间:2024/05/16 04:25

实现一个多图片的滑动

利用viewpager和fragment实现

在viewpager里的每一个view放入一个fragment,fragment里放一个imageview

fragment的数量不确定,是动态加载的,每次刷新需要重新加载一个viewpager


需要三个部分

一、配置文件

main.xml里加入Viewpager控件(android3以下好像要导入包)

<android.support.v4.view.ViewPagerandroid: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

@Overridepublic 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应该就行了

@Overridepublic void onDestroyView(){if(null != bm){bm.recycle();}Log.i(TAG, "destroy view of " + num.toString());super.onDestroyView();}

参考:http://blog.csdn.net/siyehuazhilian/article/details/26384021

http://blog.csdn.net/forever_crying/article/details/8238863/

0 0
原创粉丝点击