这个应用是在容器视图中显示列表。我们要创建一个ListFragment和一个Activity,还有与ListFragment相匹配的layout。
Fragment
创建CrimeListFragment类扩展自ListFragment。HoneyComb系统版本引入了ListFragment类,相应的,支持库也引入了该类。
import android.support.v4.app.ListFragment;
ListFragment是通过ListView将列表项展示给用户。而ListView通过adapter来申请视图对象。
Adapter负责:
创建必要的视图对象;
用模型层数据填充视图对象;
将准备好的视图对象返回给ListView。
随意例子中采用了setListAdapter(ListAdapter)来为CrimeListFragment管理内置ListView设置adapter。(详情参看后面的代码链接,现在就可以打开它对比观看)
FragmentActivity
由于每一个ActivityFragment都有相似的代码,于是作者创建了一个SingleFragmentActivity抽象类用来减少以后的代码输入。在书中的例子都是在一个FragmentContainer动态添加一个Fragment,所以唯一不同的代码就是在事物添加Fragment之前动态创建的代码。
修改CrimeActivity扩展自SingleFragmentActivity。
创建CrimeListActivity扩展自SingleFramentActivity。
部分:
Crime 列表子元素的对象
CrimeLab 可以创建和获取一个Crime 列表。
Activity
CrimeListActivity 扩展自SingleFragmentActivity 创建CrimeListFragment 事物
SingleFragmentActivity
Fragment
CrimeListFragment 根据list_item_crime.xml 生成相应的View
Res/layout
Activity_fragment.xml 定义了容易视图
List_item_crime.xml 定义了列表子元素的视图
应用功能介绍:CriminalIntent这个应用可以详细的记录各种陋习,其中包括了标题、日期和照片,支持在联系人中查找当事人
UI fragment与fragment管理器
模型层
crime类以及生成的getter与setter方法
托管UI fragmen
CriminalActivity类的fragment托管布局
CrimeFragment布局以及类的创建
RecyclerView显示列表
应用模型层将新增一个CrimeLab对象,而且显示列表需要在应用控制器层新增一个activity和一个fragment
有了RecycleView的创建避免了很多繁琐的创建,创建的时候刚好创建12个,用户下滑的时候上一个视图会回收利用,它的作用就是回收再利用,循环往复
CrimeFragment需要的id存储在CrimeActivity 的intent里,他总是需要由某个具体的Activity托管着,CrimeFragment就不能用于别的Activity。而通过argument 的方式,就可以解决上述问题。fragment实例可附带一个Bundle对象,可以bundle对象存储信息,然后调用Fragment.setArguments(Bundle),argument附加给fragment。通过getArgument()方法可获取argument。
ViewHolder和Adapter
RecycleView自身不会创建视图,它创建的是ViewHolder,而ViewHolder引用着itemView Adapter负责创建和绑定
ConstraintLayout
给CrimeFragment填充数据
使用之前学到的方法用Intent传递数据,在CrimeFragment的onCreate()中从Intent读取数据。
首先定义一个id
public static final String EXTRA_CRIME_ID =
"com.example.lijing.criminalintent.crime_id";
…..
然后在onCreate()中
UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra(EXTRA_CRIME_ID);
mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
数据在CrimeListFragment中startActivity()之
putExtra(CrimeFragment.EXTRA_CRIME_ID,c.getId());
修改好的布局
约束的XML形式
界面之间传递数据的改进
原先的代码如下
UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra(EXTRA_CRIME_ID);
在这段代码中crimeId是存储在CrimeActivity中的。现在将它由CrimeActivity的intent内的extra改为arguments bundle。每个fragment实例都可以附带一个Bundle对象。该bundle包含有key-value对,我们可以如同附加extra到Activity的intent中那样使用它们。一个key-value对即一个argument。
UUID crimeId = (UUID)getArguments().getSerializable(EXTRA_CRIME_ID);
并给fragment一个newInstance()来创建自己,并在这个静态方法里创建arguments。
总的来说就是由以前从Activity中获取参数,改成从自己的存储区里获取参数。而自己的存储区里的参数是在创建该fragment是写入的。
使用fragment argument
使用ViewPager
大体布局
为了实现向左滑向右滑的这种效果,我们需要创建一个ViewPager的activity,命名为CrimePagerActivity来取代CrimeActivity。本章采用了以代码的方式创建视图它包含以下步骤:
为ViewPager创建资源ID;
创建ViewPager实例并赋值给mViewPager;
赋值资源ID给ViewPager,并对其进行配置;
设置ViewPager为activity的内容视图。