Android五天乐(第三天)ListFragment与ViewPager

原创 2015年06月25日 09:49:51

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 App组件之ListFragment

1 ListFragement介绍 ListFragment继承于Fragment。因此它具有Fragment的特性,能够作为activity中的一部分,目的也是为了使页面设计更加灵活。 相比...
  • kakaxi1o1
  • kakaxi1o1
  • 2014年06月08日 15:34
  • 16017

Android ListFragment实例Demo(自定义适配器)

上一篇文章介绍了ListFragment,其中的ListView并没有自定义适配器,实际上在实际开发中常会用到自定义适配器,是实现更复杂的列表数据展示。所以这篇文章增加了自定义适配器,来进行ListV...
  • u012440207
  • u012440207
  • 2014年06月12日 11:43
  • 2254

Android UI开发第十七篇——Android Fragment实例(ListFragment)

Fragment是Android honeycomb 3.0新增的概念,在Android——Fragment介绍、Android Fragment使用、Android FragmentManage...
  • heng615975867
  • heng615975867
  • 2013年10月05日 10:16
  • 36792

Android中Fragment和ViewPager那点事儿(仿微信APP)

在之前的博文《Android中使用ViewPager实现屏幕页面切换和引导页效果实现》和《Android中Fragment的两种创建方式》以及《Android中Fragment与Activity之间的...
  • panhouye
  • panhouye
  • 2016年12月25日 01:17
  • 1002

两个ViewPager手势冲突的问题

当外部ViewPager里面嵌套了一个内部ViewPager的情况,如果里面的viewPager不做任何处理的话,里面viewPager的手势会被外部ViewPager截获, Android在监听到屏...
  • xuyonghong1122
  • xuyonghong1122
  • 2015年10月14日 19:09
  • 1218

Android : ViewPager+RecyclerView的联动效果

今天有个需求,上面是一组图片,下面也是一组图片,要求上面和下面的图片都能滑动,然后2者之间能联动,通俗讲就是上面的选中了下面也要跟着滑到那个图片,然后下面的图片滑动了上面也要跟着选中那个图片,所以产生...
  • qq_27263999
  • qq_27263999
  • 2016年10月13日 18:04
  • 3639

Android 中 DrawerLayout + ViewPager 怎么解决滑动冲突?

DrawerLayout 是 Android 官方的侧滑菜单控件,而 ViewPager 相信大家都很熟悉了。今天这里就讲一下当在 DrawerLayout 中嵌套 ViewPager 时,要如何解决...
  • jpush
  • jpush
  • 2017年06月09日 14:49
  • 346

RecycleView和ViewPager冲突解决与原理

1.概述在实际开发中,我们经常遇到需要在ListView或RecycleView头部添加ViewPager实现Banner轮播效果,并需要添加下拉刷新,上拉加载功能。 但,横向滑动ViewPager...
  • zhoutaochun
  • zhoutaochun
  • 2016年10月31日 23:42
  • 3036

ViewPager实现页卡的最新方法--简洁的TabLayout(谷歌支持包)

效果图:添加依赖包: compile 'com.android.support:design:22.2.0'布局文件:
  • pengkv
  • pengkv
  • 2015年07月17日 14:24
  • 27921

Fragment学习之ListFragment的使用

ListFragment就是一个包含ListView的Fragment,它可以通过数据源
  • lzm1340458776
  • lzm1340458776
  • 2014年05月07日 15:40
  • 2164
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android五天乐(第三天)ListFragment与ViewPager
举报原因:
原因补充:

(最多只允许输入30个字)