博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android五天乐(第三天)ListFragment与ViewPager
阅读量:7064 次
发布时间:2019-06-28

本文共 3901 字,大约阅读时间需要 13 分钟。

1ListFragment

今天首先学习了一种很经常使用的展示场景:列表展示。 

昨天学习了使用Fragmet来取代activity进行设计。今天在托管单个fragment的基础上,掌握托管一个布局list。先看下效果:  

由于Fragment列表须要使用ArrayList保存。而为了使Fragment对象受acrivity等生命周期影响, 创建例如以下单例类:

public class CrimeLab {    private ArrayList
mCrimes; private static CrimeLab sCrimeLab; private Context mAppContext; private CrimeLab(Context context){ mAppContext=context; mCrimes=new ArrayList
(); 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
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
{ public CrimeAdapter(ArrayList
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方法。

交互过程如: 

转载于:https://www.cnblogs.com/clnchanpin/p/7044318.html

你可能感兴趣的文章
Android程序完全退出
查看>>
【Linux】目录权限与文件权限
查看>>
如何将阿拉伯数字每三位一逗号分隔,如:15000000转化为15,000,000
查看>>
select的使用(一)
查看>>
[leetcode]Search a 2D Matrix @ Python
查看>>
java.io.BufferedOutputStream 源码分析
查看>>
Load resources from classpath in Java--reference
查看>>
关于LightMapping和NavMesh烘焙的动态载入
查看>>
(转)Android中使用ormlite实现持久化(一)--HelloOrmLite
查看>>
C语言近程型(near)和远程型(far)的区别是什么?
查看>>
jQuery选择器总结
查看>>
《Continuous Delivery》 Notes 1: The problem of delivering software
查看>>
java android 将小数度数转换为度分秒格式
查看>>
一张图知道HTML5布局(图)
查看>>
LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
查看>>
在网站开发中很有用的8个 jQuery 效果【附源码】
查看>>
桥牌笔记:Skill Level 4 D8
查看>>
[翻译] RSKImageCropper
查看>>
javaweb学习总结(三十)——EL函数库
查看>>
我在开发第一个Swift App过程中学到的四件事
查看>>