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方法。

交互过程如: 

时间: 2024-08-28 21:47:05

Android五天乐(第三天)ListFragment与ViewPager的相关文章

Android五天乐(第一天)开发环境的部署,开发流程与调试

因为项目要求参与无线端开发,本着技多不压身的指导精神,决定依然从web转攻客户端!   因为之前自己玩过两个月android(实际上只是做了两个有失水准的demo级app),本来以为这次再来学习将游刃有余. 没想到主管只给了足足一,个,礼,拜,的学习时间,第二周直接参与业务! 好吧,android五天乐begin! 1部署Android开发环境 1     java环境 2    下载    Android Studio 3    配置   andorid环境变量 开发android应用可以选择

Android五天乐(第二天)Activity跳转与数据传输,Fragment

1 Activity的生命周期 activity在生命周期内共有运行,暂停,和停止三种状态.每次发生状态转换时,都有一个Activity方法将状态改变的消息通知给activity.activity的生命周期,状态及状态切换时系统调用的方法如下图所示. 2改变Activity状态的三种场景 改变Activity状态的场景有很多,这里举例三种比较典型的场景:按回退键,按下home键,翻转屏幕. 首先打开应用,通过对activity的各个方法设置log信息,可以看到activity对象一次调用了onC

android快速上手(三)常用控件使用

完成了android的第一个程序HelloWorld,下面就开始控件的学习,下面是一些常见的控件. (一)TextView 简单的文本描述 (二)EditText 编辑框,输入文字信息 (三)Button 按钮,点击后会触发点击事件,可以对事件进行处理 (四)ImageView 图片控件,可以加载图片显示 (五)ListView 列表,需要跟适配器Adapter结合,适配器提供数据 (六)Toast 闪现提示语,常用于普通的提示文本,只显示一小段时间自动消失 (七)ScrollView 一般用于

Android中常用的三种存储方法浅析

Android中常用的三种存储方法浅析 Android中数据存储有5种方式: [1]使用SharedPreferences存储数据 [2]文件存储数据 [3]SQLite数据库存储数据 [4]使用ContentProvider存储数据 [5]网络存储数据 在这里我只总结了三种我用到过的或即将可能用到的三种存储方法. 一.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基

Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

关键词:蓝牙blueZ  A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_get_properties.AUDIO.DBUS版本号:基于android4.2之前版本号 bluez内核:linux/linux3.08系统:android/android4.1.3.4作者:xubin341719(欢迎转载.请注明作者.请尊重版权谢谢)欢迎指正错误.共同学习.共同进步!! 參考

Android图表库MPAndroidChart(三)——双重轴线形图的实现,这次就so easy了

Android图表库MPAndroidChart(三)--双重轴线形图的实现,这次就so easy了 承上启下,当我们学习完这篇 Android图表库MPAndroidChart(二)--线形图的方方面面,看完你会回来感谢我的 之后,你对MPAndroidChart的套路应该是有一定的了解了,用来用去就是那么几个不断的扩展,那我们今天扩展一下双轴的图标,什么是双轴呢?就是两个x或者两个y轴,看图 为了形成鲜明的对比,我把背景设置成黑色的了,我们来看下这个我们应该怎么去实现? 一.基本实现 这里布

(转载)Android项目实战(三十二):圆角对话框Dialog

Android项目实战(三十二):圆角对话框Dialog 前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话框的"确定"按钮 难点:1.对话框边框圆角显示 2.考虑到提示文本字数不确定,在不影响美观的情况下,需要在一行内显示提示的文字信息   3.设置对话框的宽和高 技术储备: 1.安卓开发_使用AlertDialog实现对话框    知道AlertDialog有setView(view) ,Dia

Android开源项目第三篇——优秀项目篇

本文为那些不错的Android开源项目第三篇——优秀项目篇,主要介绍那些还不错的完整Android项目. Android开源项目系列汇总已完成,包括: Android开源项目第一篇——个性化控件(View)篇 Android开源项目第二篇——工具库篇 Android开源项目第三篇——优秀项目篇 Android开源项目第四篇——开发及测试工具篇 Android开源项目第五篇——优秀个人和团体篇 记录的项目主要依据是项目有意思或项目分层规范比较好. Linux 项目地址:https://github

【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ  A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_get_properties.AUDIO.DBUS版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:android/android4