Android五天乐(第三天)ListFragment与ViewPager
1ListFragment
今天首先学习了一种很经常使用的展示场景:列表展示。
昨天学习了使用Fragmet来取代activity进行设计。今天在托管单个fragment的基础上,掌握托管一个布局list。先看下效果:
由于Fragment列表须要使用ArrayList保存。而为了使Fragment对象受acrivity等生命周期影响, 创建例如以下单例类:
public class CrimeLab {
private ArrayList<Crime> mCrimes;
private static CrimeLab sCrimeLab;
private Context mAppContext;
private CrimeLab(Context context){
mAppContext=context;
mCrimes=new ArrayList<Crime>();
for(int i=0;i<100;i++){
Crime c =new Crime();
c.setTitle("Crime #"+i);
c.setSolved(i%2==0);
mCrimes.add(c);
}
}
public static CrimeLab get(Context c){
if(sCrimeLab==null){
sCrimeLab=new CrimeLab(c.getApplicationContext());
}
return sCrimeLab;
}
public ArrayList<Crime> getmCrimes(){
return mCrimes;
}
public Crime getCrime(UUID id){
for (Crime c: mCrimes){
if(c.getId().equals(id)){
return c;
}
}
return null;
}
}
同一时候,还要建立对应的fragment布局文件和类文件。实际上,存在专门支持list fragment的类:ListFragment。继承这个类就可以。之后可使用其内置的listadapter。
为什么使用adapter呢? 由于我们的fragmentlab中新建了100个fragment对象,而我们不可能在一个页面中把他们所有显示出来。而是须要显示时才创建对象。
adapter就是从模型层获得数据。并把它提供给ListView显示的桥梁。
private class CrimeAdapter extends ArrayAdapter<Crime>{
public CrimeAdapter(ArrayList<Crime> crimes){
super(getActivity(),0,crimes);
}
@Override
public View getView(int position,View convertView,ViewGroup parent){
if(convertView==null){
convertView=getActivity().getLayoutInflater().inflate(R.layout.list_item_crime,null);
}
Crime c=getItem(position);
TextView titleTextView=(TextView)convertView.findViewById(R.id.crime_list_item_titleTextView);
titleTextView.setText(c.getTitle());
TextView dateTextView=(TextView)convertView.findViewById(R.id.crime_list_item_dateTextView);
dateTextView.setText(c.getDate().toString());
CheckBox solvedCheckBox=(CheckBox)convertView.findViewById(R.id.crime_list_item_solvedCheckBox);
solvedCheckBox.setChecked(c.isSolved());
return convertView;
}
}
实现自己定制Adapater的代码。之所以要实现自己的adapter,是由于在list的每个条目我们定制了自己的布局。
如代码中的list_item_crime.
这样就得到了list显示的fragment。
2ViewPager
ViewPager能够实现左右滑动屏幕切换查看不同列表项的功能。
ViewPager须要借助于Adapter才可以提供视图。
通过PagerAdapter的子类:FragmentStatePagerAdapter来处理两者间的配合问题。
这里须要实现两个方法,getCount()和getItem()。
代码示比例如以下:
mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) {
@Override
public int getCount(){
return mCrimes.size();
}
@Override
public Fragment getItem(int pos) {
Crime crime=mCrimes.get(pos);
return CrimeFragment.newInstance(crime.getId());
}
});
3 fragment传输数据
跟activity类似。fragment间也能够进行传输数据。并且fragment级的传输数据会使编程更加灵活。
试想例如以下场景: 在CrimeFragment中须要按键调出DatePickerFragment, 后者的初始化须要前者提供的数据。同一时候,DatePickerFragment的返回值也要作用于CrimeFragment。
须要做的事情有例如以下几步:
1)从CrimeFragment 初始化DatePickerFragment时, 将数据作为构造參数传入
2)DatePickerFragment构造时。将传入的值保存到argument
3)DatePickerFragment渲染时,取arguments中值
4)DatePickerFragment将值回传给CrimeFragment
为实现以上过程,首先要在DatePickerFragment 编写newInstance方法, 改方法能够在实例化DatePickerFragment时被调用并接受參数。同一时候在fragment create前准备好数据
public static DatePickerFragment newInstance(Date date){
Bundle args=new Bundle();
args.putSerializable(EXTRA_DATE,date);
DatePickerFragment fragment=new DatePickerFragment();
fragment.setArguments(args);
return fragment;
}
返回数据时,则覆盖onActivityResult方法。
交互过程如:
Android五天乐(第三天)ListFragment与ViewPager的更多相关文章
- Android五天乐(第一天)开发环境的部署,开发流程与调试
由于项目要求參与无线端开发,本着技多不压身的指导精神,决定依旧从web转攻client! 由于之前自己玩过两个月android(实际上仅仅是做了两个有失水准的demo级app),本来以为这次再来学习将 ...
- Android五天乐(第二天)Activity跳转与传输数据,Fragment
1 Activity的生命周期 activity在生命周期内共同拥有执行.暂停,和停止三种状态.每次发生状态转换时,都有一个Activity方法将状态改变的消息通知给activity.activity ...
- Android Fragment(三)ListFragment简单介绍以及Fragment之间通信
一.Fragment通信简单介绍:Fragments之间是不能够直接通信的,他们之间的通信是通过Activity这个中间件来通信的, 为了让Fragment跟它的Activity通信,我们可以在Fra ...
- 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ A2DP.SINK.sink_connect.s ...
- 【转】android 电容屏(三):驱动调试之驱动程序分析篇
关键词:android 电容屏 tp 工作队列 中断 坐点计算 电容屏主要参数平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310( ...
- Android图表库MPAndroidChart(三)——双重轴线形图的实现,这次就so easy了
Android图表库MPAndroidChart(三)--双重轴线形图的实现,这次就so easy了 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库 ...
- Android五种数据存储方式
android 五种数据存储 :SharePreferences.SQLite.Contert Provider.File.网络存储 Android系统提供了四种存储数据方式.分别为:SharePre ...
- Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
关键词:蓝牙blueZ A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_ ...
- Android UI开发第三十九篇——Tab界面实现汇总及比较
Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...
随机推荐
- Uboot优美代码赏析1:目录结构和malkefile分析
Uboot优美代码赏析1:目录结构和malkefile分析 关于Uboot自己选的版本是目前最新的2011.06,官方网址为:http://www.denx.de/wiki/U-Boot/WebHom ...
- ajax异步请求获取数据,实现滚动数字的效果。
BackgroundPositionAnimate.js下载 需要导入的js: <script type="text/javascript" src="js/jqu ...
- tp 在Nginx上各种404
对于ThinkPHP的URL访问路劲如:http://域名/index.php/Index/BlogTest/read,原先的Nginx的是不支持的pathinfo路劲的,导致你在thinkPHP5上 ...
- cocos2d-x学习笔记(18)--游戏打包(windows平台)
cocos2d-x学习笔记(18)--游戏打包(windows平台) 之前做好的游戏,都是在vs2008下编译执行的.假设说想把游戏公布到网上或者和其它人一起分享游戏,那就得对游戏 ...
- POJ 2906 数学期望
开始时直接设了一个状态,dp[i][j]为发现i种bug,j个系统有bug的期望天数.但很错误,没能转移下去.... 看了题解,设状态dp[i][j]为已发现i种bug,j个系统有bug,到完成目标状 ...
- [Python Test] Use pytest fixtures to reduce duplicated code across unit tests
In this lesson, you will learn how to implement pytest fixtures. Many unit tests have the same resou ...
- 数据结构—单链表(类C语言描写叙述)
单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ...
- [NOI.AC#32]sort 构造
链接 50分做法(只有0,1) 根据归并排序的思想,假设我们现在已经把 \(l\dots mid\) 和 \(mid+1\dots r\) 排好序 只要把左边连续的1和右边连续的0翻转即可 inlin ...
- 使用LSTM做电影评论负面检测——使用朴素贝叶斯才51%,但是使用LSTM可以达到99%准确度
基本思路: 每个评论取前200个单词.然后生成词汇表,利用词汇index标注评论(对 每条评论的前200个单词编号而已),然后使用LSTM做正负评论检测. 代码解读见[[[评论]]]!embeddin ...
- Codeforces 667D World Tour 最短路
链接 Codeforces 667D World Tour 题意 给你一个有向稀疏图,3000个点,5000条边. 问选出4个点A,B,C,D 使得 A-B, B-C, C-D 的最短路之和最大. 思 ...